我也一直試圖做同樣的事情;從另一個「控制」應用程序中運行應用程序的測試(或任何rake任務)。
原因:(只是讓我沒有得到送達「?爲什麼地球上」)
我想建立一個應用程序(而不是像cruisecontrol.rb),它可以監控,調度和查看一組應用程序的規格。
在cruisecontrol的源代碼中,我發現Bundler提供了一個解決方案;的https://github.com/thoughtworks/cruisecontrol.rb/blob/master/lib/platform.rb
Bundler.with_clean_env do
system "rake spec"
end
見line56,步驟出了捆綁和命令,沒有控制應用程序的運行的寶石。
但是最有可能的是,該命令使用bundle exec
然後停止工作。
Bundler.with_clean_env { system "bundle exec rake spec" }
而你回到了完全相同的問題。這是由一些仍然存在並由子shell繼承的bundler變量引起的。完整(非常好)解釋here。
解決方法是像這樣更改bundler上的with_clean_env
方法;
BUNDLER_VARS = %w(BUNDLE_GEMFILE RUBYOPT BUNDLE_BIN_PATH)
module Bundler
def self.with_clean_env &blk
bundled_env = ENV.to_hash
BUNDLER_VARS.each{ |var| ENV.delete(var) }
yield
ensure
ENV.replace(bundled_env.to_hash)
end
end
上面的代碼從here
我把我的控制應用程序的environment.rb文件(這也許應該是在初始化?),現在我可以從內部運行其他應用程序的規格控制應用。
#in control app
result = nil
Dir.chdir(test_app_path) #move into test app
Bundler.with_clean_env { result = `bundle exec rake spec` } #run test apps specs
puts result #display result inside control app