我有一個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中移出來,並轉換成標準腳本(重命名輸出文件是一個糟糕的選項,不會被考慮)?
你釘它 - 感謝! –
在'Bundler.with_clean_env do ... end'塊中包裝也似乎很好。 –