0

宝石として構築しているルビーエクステンションがあります。このディレクトリ構造を持っています

|-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'」について不平を言っています。

誰かが理由を知っていますか?

4

1 に答える 1

3

私はそれを疑う:

  1. irb ではrequire 'cowboy'、現在インストールされている gem dir を指すようにロード パスを自動的に設定するよう ruby​​gems に指示します。
  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) で、require 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 に答える