2012-11-05 61 views
0

我有我建立一個寶石紅寶石擴展。它有這個目錄結構Ruby的C擴展不能「require'd

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

當我建立並安裝它,有沒有錯誤,「require'ing寶石(例如 需要‘牛仔’)在IRB工作正常。

然而,當我運行「Ruby測試/ test_cowboy.rb」我從需要得到一個加載錯誤(它實際上是抱怨「需要‘牛仔/牛仔’」,生活在LIB/cowboy.rb。

有誰知道爲什麼???

+0

你使用的是什麼平臺和Ruby版本?你的'$ LOAD_PATH'包含正確的目錄嗎? – tadman

+0

如何檢查加載路徑?如果我使用捆綁器,應該照顧它嗎?我正在使用'bundle exec ruby​​ test/test_cowboy.rb'。 – aciniglio

+0

ruby​​ 1.9.3p194(2012-04-20修訂版35410)[x86_64-darwin11.4.2] – aciniglio

回答

3

我懷疑:

    在IRB
  1. ,當你require 'cowboy',告訴RubyGems的自動設置負載路徑指向當前已安裝的寶石DIR
  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__) 
+0

看起來不錯。然而,我現在遇到了這樣一個問題,我現在的測試方法'gem build cowboy.gemspec && gem install cowboy-0.0.1.gem'似乎沒有在任何地方放置.bundle或.so。我應該在開發過程中使用不同的機制來構建嗎? – aciniglio

+0

您可以使用[這裏]描述的rake任務(http://guides.rubygems.org/c-extensions/#tutorial-rakefile)。如果仍有問題,請將其作爲單獨問題提出。 – Kelvin