我目前正在构建一个使用sqlite3数据库来存储网站中已解析内容的gem。当我在命令行中运行gem名称时,当我在它的原始文件目录中时,程序运行没有任何问题。
但是,当我将gem安装到另一个项目并尝试运行它时,我收到一个错误:
/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
这是我第一次构建ruby gem,所以我知道我必须在我的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 :(得分:0)
我发现问题是什么,首先我必须在我的主lib
文件中进行简单的重新排列:
module MTGCardFinder #needs to be defined first so that environment loads correctly
end
require_relative '../config/environment'
在我的环境要求特定文件是模块MTGCardFinder
的子项之前,所以它是以未初始化的常量错误响应,所以我只需要先定义模块,以便解释器可以在看到之前读取其他是必需的。
第二个修复是自动创建一个包含存储数据库的目录,位于安装gem的当前目录中。我在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