我有一个ruby扩展,我正在构建一个gem。它有这个目录结构
|-ext
\-cowboy
\- extconf.rb
|- cowboy.c
|-lib
\- cowboy.rb
|- cowboy
\- version.rb
|- test
\- test_cowboy.rb
当我构建并安装它时,没有错误,并且'需要'宝石(例如 要求'牛仔')在irb中工作正常。
然而,当我运行“ruby test / test_cowboy.rb”时,我从require中得到一个加载错误(它实际上是抱怨生活在lib / cowboy.rb中的“require'cowboy / cowboy'”。
有谁知道为什么???
答案 0 :(得分:3)
我怀疑:
require 'cowboy'
时,告诉rubygems自动设置加载路径以指向当前安装的gem目录。test/test_cowboy.rb
时,它不会require 'cowboy'
。这是有道理的,因为在开发过程中,您不希望加载已安装的gem版本,这可能与您工作目录中的代码不同。我认为你应该创建一个设置加载路径的test/test_helper.rb
文件:
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
如果编译的共享对象文件(.so
或.bundle
)未放置在lib
中,则可能需要添加其他目录。
然后在每个测试文件中(例如test/test_cowboy.rb
),需要test/test_helper.rb
:
require File.expand_path('../test_helper.rb', __FILE__)
如果您有子目录,则需要调整该相对路径。例如。如果你有一个文件test/shoes/spur.rb
,你可以使用:
require File.expand_path('../../test_helper.rb', __FILE__)