我有一个执行多个shell命令的Rails 4应用程序,一切正常,但现在我正在尝试从它执行一个shell命令来检查不同应用程序的捆绑,甚至是这个应用程序未使用的引擎,以及我得到的就是结果,好像是在查看自己的包。
这可能令人困惑,所以让我试着让它更清楚:
Rails app
|--operations folder
|--app1
|--engine1
|--app2
现在rails应用程序执行一个shell命令来检查操作文件夹中任何这些应用程序/引擎的包,如下所示:
out = %x[cd operations/app1 && bundle list 2>&1]
但结果是执行Rails应用程序使用的宝石列表,而不是我要检查的app1中的宝石列表。
为什么会这样?我也尝试使用--gemfile=
选项指定Gemfile无济于事。如何在目标应用上执行捆绑操作?
这样做的原因是我构建了一个持续集成应用程序,用于测试和构建来自其他应用程序和引擎的软件包,有时一些应用程序/引擎需要CI没有的gem,因此运行测试失败我想在运行测试之前让CI安装它们,如果它没有它们的话。
答案 0 :(得分:0)
默认情况下,子进程继承Bundler设置的环境。
要抑制此行为,请使用包含要在干净环境中运行的命令的块调用Bundler.with_clean_env
:
out = Bundler.with_clean_env { %x[cd operations/app1 && bundle list 2>&1] }
有关详情,请参阅http://bundler.io/man/bundle-exec.1.html#Shelling-out