我构建了一个名为prawn_charts的gem,并且可以成功地要求包含所有类的模块(这些类都在不同的文件中)和来自项目根目录的类,并在irb中使用此命令:
require "./lib/prawn_charts.rb"
但是,当我使用$ rake build
和$ rake install
创建gem时,cd到我的主目录,并且需要irb中的gem,我只能加载包装器模块而不是任何单个类:
~ $ irb
>> require 'prawn_charts'
=> true
>> PrawnCharts # this works
=> PrawnCharts
>> PrawnCharts::YLabelsDataCollector # don't know why this causes an error
NameError: uninitialized constant PrawnCharts::YLabelsDataCollector
以下是lib/prawn_charts.rb
文件的样子:
require 'prawn'
require_relative "./prawn_charts/version"
module PrawnCharts
end
# this loads PrawnCharts::YLabelsDataCollector
Dir["./lib/data_collectors/**/*.rb"].each {|file| require file }
Dir["./lib/renderers/**/*.rb"].each {|file| require file }
我在gemspec文件中也有这一行:
gem.files = `git ls-files`.split($/)
编辑:
这是我在lib/prawn_charts.rb
中应该拥有的:
lib_path = File.expand_path(File.dirname(__FILE__))
Dir["#{lib_path}/prawn_charts/data_collectors/**/*.rb"].each {|file| require file }
Dir["#{lib_path}/prawn_charts/renderers/**/*.rb"].each {|file| require file }
答案 0 :(得分:1)
你的Dir globbing是相对于你当前的工作目录 - 而不是gem目录。这就是为什么当你在gem的根目录时它可以工作,但是当你从你的主目录运行它时它不会工作。
调整它以便在安装后运行它时尝试加载哪些文件,你会看到我的意思。
如果您已经加载了rubygems,那么您不需要这样做,因为它会将路径添加到加载路径,因此您只需要“data_collectors /......”