建造并要求宝石

时间:2013-08-07 23:29:37

标签: ruby gem

我构建了一个名为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 }

1 个答案:

答案 0 :(得分:1)

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

调整它以便在安装后运行它时尝试加载哪些文件,你会看到我的意思。

如果您已经加载了rubygems,那么您不需要这样做,因为它会将路径添加到加载路径,因此您只需要“data_collectors /......”