2017-04-26 216 views
0

我目前正在构建一个使用sqlite3数据库来存储来自网站的分析内容的宝石。当我在命令行中运行gem名称时,当它位于原始文件目录中时,程序运行时没有任何问题。从红宝石宝石中使用内置的sqlite3数据库

然而,当我安装宝石到另一个项目,并尝试运行它,我得到一个错误:

/usr/local/rvm/gems/ruby-2.3.1/gems/mtg-card-finder-0.1.1/config/environment.rb:8:in `initialize': unable to open database file (SQLite3::CantOpenException) 

我已经创建了数据库文件lib文件夹之外,但它在我的environment文件中引用:

require 'open-uri' 
require 'sqlite3' 
require "tco" 
require "mechanize" 
require "nokogiri" 
require "require_all" 

DB = {:conn => SQLite3::Database.new("db/cards.db")} #this gives me validation to reach the database that module Persistable interacts with 

require_all 'lib/mtg_card_finder' #this allows me to simultaneously require everything in lib/mtg_card_finder 

然后要求通过我的主要文件中lib

require_relative '../config/environment' 

module MTGCardFinder 
end 

这是我第一次构建一个红宝石,所以我知道我必须在我的gemspec上搞一些东西,或者其他一些我不知道的东西是不允许数据库在安装时可访问作为一颗宝石。

lib = File.expand_path('../lib', __FILE__) 
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) 
require 'mtg_card_finder/version.rb' 

    spec.files   = `git ls-files -z`.split("\x0").reject do |f| 
    f.match(%r{^(test|spec|features)/}) 
    end 

    spec.executables << "mtg-card-finder" 
    spec.require_paths = ["lib"] 

    spec.add_development_dependency "bundler", "~> 1.14" 
    spec.add_development_dependency "rake", "~> 12.0" 
    spec.add_development_dependency "pry", "~> 0.10.4" 
    spec.add_dependency "rubysl-open-uri", "~> 2.0" 
    spec.add_dependency "nokogiri", "~> 1.7.1" 
    spec.add_dependency "tco", "~> 0.1.8" 
    spec.add_dependency "sqlite3", "~> 1.3.13" 
    spec.add_dependency "mechanize", "~> 2.7.5" 
    spec.add_dependency "require_all", "~> 1.4" 

任何建议将是如此的欢迎! :) 这里是回购,如果你需要从gemspec和这些额外的线路: https://github.com/JuanGongora/mtg-card-finder

+0

如果DB/cards.db需要在使用它的应用程序可用,我认为它不是因为gemspec中的“文件”指令会过滤掉任何不属于测试,规范或功能的内容。 – burnettk

回答

0

我发现了什么问题,我首先得做一个简单的重新安排我的主要lib文件:

module MTGCardFinder #needs to be defined first so that environment loads correctly 
end 

require_relative '../config/environment' 

在我的环境要求特定文件是模块MTGCardFinder的子模块,因此它使用未初始化的常量错误进行响应,所以我只需先定义模块,以便解释器在看到还需要什么之前就可以读取该模块。

第二个修复程序会自动创建一个目录,该目录将包含存储的数据库,该目录位于要安装gem的当前目录中。我有宝石中的原始数据库文件夹,但它没有访问它们,所以这是变通方法:

require 'fileutils' # for creating the directory 

DIR = "db" 
FileUtils.makedirs(DIR) 

DB = {:conn => SQLite3::Database.new("db/cards.db")} #this gives me validation to reach the database that module Persistable interacts with