Ruby 建造和需要宝石

Ruby 建造和需要宝石,ruby,gem,Ruby,Gem,我构建了一个名为prawn_charts的gem,可以成功地要求模块包装所有类(这些类都在不同的文件中)以及项目根目录中的类,并在irb中使用以下命令: require "./lib/prawn_charts.rb" 但是,当我使用$rake build和$rake install,cd创建gem到我的主目录,并且需要irb中的gem时,我只能加载包装器模块,不能加载任何单个类: ~ $ irb >> require 'prawn_charts' => true >&g

我构建了一个名为prawn_charts的gem,可以成功地要求模块包装所有类(这些类都在不同的文件中)以及项目根目录中的类,并在irb中使用以下命令:

require "./lib/prawn_charts.rb"
但是,当我使用
$rake build
$rake install
,cd创建gem到我的主目录,并且需要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\u 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\u 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 }

Dir globbing是相对于当前工作目录的,而不是gem目录。这就是为什么当您在gem的根目录中时,它可以工作,但当您从主目录运行它时,它就不能工作

调整它,当你在安装后运行它时,吐出它试图加载的文件,你就会明白我的意思了


如果您也加载了rubygems,则不需要执行此操作,因为它会将路径添加到加载路径中,这样您就可以只需要“data\u collectors/…”

1。是否可以确保
Dir[”/lib/data\u collectors/***.rb”]
确实返回您想要的文件?2.
YLabelsDataCollector
在哪里定义?@MikeLi-I已选中,Dir[“/lib/data_collector/***.rb”]”返回我想要的所有文件
YLabelsDataCollector
定义如下:
/lib/data\u collector/graph/y\u labels\u data\u collector.rb
。当我在gem中工作时,所有文件都被正确加载。就在我正式打包gem并在遇到问题时要求将其放在另一个目录中的时候。谢谢。@MikeLi-事实上,你是对的,我没有正确加载文件。我的加载解决方案在项目根目录下工作,但在任何其他目录下都不工作。再次感谢你的帮助。