0

创建自定义 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它应该存在。

在另一个 gemdsi_fabric中有代码dsi_fabric/lib/dsi_fabric

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

尝试从gemlib/目录运行它:dsi_fabric

ruby -rubygems ./dsi_fabric.rb arg1 arg2

..结果是:

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

这是指Cuke.Features.dsi_fabric.rb

我究竟做错了什么?

4

3 回答 3

1

您需要“dsi_core”而不是“cuke”。尝试更改require 'dsi_core'require 'cuke'.

于 2012-12-10T14:53:38.983 回答
0

如果您在现有命名空间中进行测试,问题可以是命名空间,因此请尝试使用根命名空间引用。

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

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

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

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

编辑

也试试

require 'rubygems'
require 'dsi_core'
于 2012-12-10T15:04:18.933 回答
0

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

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

因此,我上面的内容是错误的 -要从 gem中的 gem导入cuke.rb文件,您将使用:dsi_coredsi_fabric

require 'cuke'

require dsi_coreGem 规范和 gemspec 的本质是隐含的。

然后在代码中引用将是

DsiCore::Cuke

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

我很困惑,因为 mny public gems 表明您应该使用require以下表格:

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

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

require 'dir-name/module-or-class'

在此示例中,gemgem-name具有以下目录结构:

lib/gem-name/module-or-class.rb

即他们在gem 的lib/目录中创建了一个以gem 本身命名的文件夹。

于 2012-12-10T15:13:19.063 回答