Ruby 1.8.7:无法从自定义gem加载模块

时间:2012-12-10 14:40:19

标签: ruby import module gem

创建自定义gem之后,我想引用它包含的模块中定义的函数。

自定义宝石为dsi_core,模块lib/cuke.rb仅包含:

module DsiCore
    module Cuke
        def self.Features(*args)
            puts "Hello world!"
        end
    end
end

我已经安装了gem,并且可以看到/var/lib/gems/1.8/gems/dsi_core-0.1.0/lib/cuke.rb存在。

在另一个宝石dsi_fabric中有代码dsi_fabric/lib/dsi_fabric

require 'dsi_core'
# ...
DsiCore::Cuke.Features(*ARGV)

尝试从lib/ gem:{/ p>的dsi_fabric目录运行此命令

ruby -rubygems ./dsi_fabric.rb arg1 arg2

..结果:

./dsi_fabric.rb:7: uninitialized constant DsiCore::Cuke (NameError)

这是指Cuke.Features中的dsi_fabric.rb行。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

你需要'dsi_core'而不是'cuke'。尝试将require 'dsi_core'更改为require 'cuke'

答案 1 :(得分:0)

如果您在现有命名空间中测试问题可以是命名空间,那么请尝试使用root命名空间参考。

::DsiCore::Cuke.Features(*ARGS)

也像我在评论中提到的那样你需要把

def self.Features(*args)
  # ...
end

嘿嘿我不喜欢那个大写方法名称注释,而是他自己的每一个:)

修改

也可以尝试

require 'rubygems'
require 'dsi_core'

答案 2 :(得分:0)

我误解了Gem导入的工作原理。

如果你创建一个gem并在gemspec中添加其他gem依赖项,那么这些依赖项已经自动导入了。

因此我上面的内容是错误的 - 从gem cuke.rb中导入dsi_core文件,你会使用:{/ p>

dsi_fabric

即。 require 'cuke' 本质上是Gem规范和gemspec的隐含。

然后在代码中引用

require dsi_core

..正如我最初发布的那样。

我很困惑因为mny公共宝石表明你应该使用DsiCore::Cuke 形式:

require

然而这是误导性的:根本没有使用gem名称,而是以gem命名的目录:

require `gem-name/module-or-class`.

在此示例中,gem require 'dir-name/module-or-class' 具有以下目录结构:

gem-name

即。他们在gem的lib/gem-name/module-or-class.rb 目录中创建了一个以gem本身命名的文件夹。