Я тоже пытался сделать то же самое;запустить тесты приложения (или любую задачу rake) из другого приложения «control».
Причина: (только чтобы мне не ответили «почему, черт возьми?»)
Я пытаюсь создать приложение (скорее как круиз-контроль.rb) который может отслеживать, планировать и просматривать спецификации для набора приложений.
После некоторого поиска в источнике Cruisecontrol я обнаружил, что Bundler предлагает решение;
Bundler.with_clean_env do
system "rake spec"
end
см. строку56 изhttps://github.com/thoughtworks/cruisecontrol.rb/blob/master/lib/platform.rb
Это выходит из пакета, и команда запускается без гемов управляющего приложения.
НО , как наиболее вероятно, команда использует bundle exec
, тогда это перестает работать.
Bundler.with_clean_env { system "bundle exec rake spec" }
И вы сразу же вернулись к той же самой проблеме.Это вызвано тем, что некоторые переменные-упаковщики все еще существуют и наследуются вложенной оболочкой.Полное (очень хорошее) объяснение здесь .
Решение состоит в том, чтобы изменить метод 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
код выше здесь
Я поместил это в 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