我也一直试图做同样的事情;从另一个“控制”应用程序中运行应用程序的测试(或任何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