创建自定义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
行。
我做错了什么?
答案 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本身命名的文件夹。