0

我有一个 ruby​​ 扩展,我正在构建一个 gem。它有这个目录结构

|-ext
  \-cowboy
    \- extconf.rb
    |- cowboy.c
|-lib
  \- cowboy.rb
  |- cowboy
    \- version.rb
|- test
  \- test_cowboy.rb

当我构建并安装它时,没有错误,并且'需要'gem(例如需要'cowboy')在irb中工作正常。

但是,当我运行“ruby test/test_cowboy.rb”时,我从 require 中得到一个加载错误(它实际上是在抱怨 lib/cowboy.rb 中的“require 'cowboy/cowboy'”。

有谁知道为什么???

4

1 回答 1

3

我怀疑:

  1. 在 irb 中,当 you 时require 'cowboy',它告诉 ruby​​gems 自动设置加载路径以指向当前安装的 gem 目录。
  2. 当你运行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__)
于 2012-11-05T21:36:05.787 回答