0

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

require "./lib/prawn_charts.rb"

但是,当我使用 and 创建 gem 时$ rake build$ rake installcd 到我的主目录,并在 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 }
4

1 回答 1

1

您的 Dir globbing 是相对于您当前的工作目录的——而不是 gem 目录。这就是为什么它在您位于 gem 的根目录中时有效,但在您从主目录运行时无效的原因。

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

如果您也加载了 ruby​​gems,则不需要这样做,因为它会将路径添加到加载路径,因此您只需要求“data_collectors/......”

于 2013-08-08T01:00:33.123 回答