2013-05-14 28 views
3

我有一個gem,它只是爲了便於實現而收集幾個引擎,並且爲所有包含的引擎提供一些實用方法。一種這樣的實用方法是發佈任務以發佈所有收集的引擎的新版本。耙搭建運行在不正確的背景下

我的問題是,當我運行的代碼應該在其中一個收集的引擎的上下文中執行時,它的所有內容(git命令,文件系統操作等)都起作用,但rake build命令除外。出於某種原因,該命令以某種方式在傘寶石的上下文中運行,並從Gemfile.lock中獲取版本號。

使用此代碼示例:

Dir.chdir(PATH_TO_COLLECTED_ENGINE) do 
    # Below lie all of my failed build attempts, all of which failed in the same way... 

    #p sh('bundle' , 'exec' , 'rake' , 'build') 

    #p sh('bundle exec rake build') 

    #p `bundle exec rake build` 

    #thr = Thread.new { 
    # p `bundle exec rake build` 
    #} 
    #thr.join 

    #load File.join(Dir.pwd, 'Rakefile') 
    #Rake::Task['build'].invoke 

    #p `gem build #{ PATH_TO_COLLECTED_ENGINE_GEMSPEC_FILE }` 
end 

當從一個標準的Ruby文件運行時,我得到的collected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.9.gem所需的輸出,但在傘寶石rake任務運行的時候,我得到了令人費解輸出collected_engine_a 3.12.9 built to pkg/collected_engine_a-3.12.2.gem。看起來這個版本是從傘寶石的gemfile.lock派生的(如果我在那裏調整版本,它會影響輸出)。

我已經嘗試過和沒有bundle exec前言,基本上是相同的結果。

任何人都可以想出一種方法來獲得這個選擇正確的上下文,或者我堅持將這些從rakefile中移出來,並轉換成標準腳本(重命名輸出文件是一個糟糕的選項,不會被考慮)?

回答

1

bundle exec在子shell中啓動時有特定行爲。你可以看到下面的註釋中bundle help exec

make sure that if bundler is invoked in the subshell, it uses the same Gemfile (by setting BUNDLE_GEMFILE)

所以你的情況,你會怎麼做:

bundle exec rake build BUNDLE_GEMFILE=#{PATH_TO_COLLECTED_ENGINE}/Gemfile

+0

你釘它 - 感謝! –

+0

在'Bundler.with_clean_env do ... end'塊中包裝也似乎很好。 –