我也一直在尝试做同样的事情;从另一个“控制”应用程序内部运行应用程序的测试(或任何 rake 任务)。
原因:(只是这样我就不会得到“到底为什么?”)
我正在尝试构建一个应用程序(而不是像 Cruisecontrol.rb 一样),它可以监控、安排和审查一组应用程序的规范。
在浏览了 Cruisecontrol 的源代码后,我发现 Bundler 提供了一个解决方案;
Bundler.with_clean_env do
system "rake spec"
end
见https://github.com/thoughtworks/cruisecontrol.rb/blob/master/lib/platform.rb的第56行
从包中退出,命令在没有控制应用程序的 gem 的情况下运行。
但是很可能,该命令使用bundle exec,然后停止工作。
Bundler.with_clean_env { system "bundle exec rake spec" }
你又回到了完全相同的问题。这是由一些仍然存在并被子 shell 继承的捆绑程序变量引起的。完整(非常好的)解释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