Ruby C扩展不能'require'd

时间:2012-11-05 21:09:48

标签: ruby ruby-c-extension

我有一个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'”。

有谁知道为什么???

1 个答案:

答案 0 :(得分:3)

我怀疑:

  1. in irb,当你require 'cowboy'时,告诉rubygems自动设置加载路径以指向当前安装的gem目录。
  2. 当您运行test/test_cowboy.rb时,它不会require 'cowboy'。这是有道理的,因为在开发过程中,您不希望加载已安装的gem版本,这可能与您工作目录中的代码不同。
  3. 我认为你应该创建一个设置加载路径的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__)