我正在尝试将一个快速的Sinatra应用程序放在一起,调用一些需要自己的Bundler环境运行的测试ruby脚本。
在我的Sinatra应用程序中构建一个方法我想运行类似
的方法system("cd /test_app/; bundle exec ruby some_file.rb")
由于bundler设置其环境的方式,这不起作用。有没有办法启动一个新的shell会话来执行我的脚本,以便它可以从Sinatra工作?
还是有另一种方法吗?基本上我唯一的要求是可以从网页上的链接触发这些脚本,这样一些团队成员可以启动测试过程。
答案 0 :(得分:1)
这似乎有效:
Dir.chdir "/test_app"
`bundle exec ruby some_file.rb`
在我开始使用sinatra以获得正确的红宝石之前,我还需要rvm use ruby-1.9.2-p320
。 rvm不喜欢被告知要在ruby过程中改变自己。 (这是有道理的!)
(使用后面的刻度而不是系统(),你可以得到输出,这样你就可以打印它或者诸如此类的东西。)
答案 1 :(得分:1)
发现这个片段很好地清理了捆绑器env。 - http://johnbintz.github.com/blog/2012/02/02/the-cleanest-bundler-env/
Bundler.with_sparkling_clean_env do
system("cd /test_app; bundle --gemfile ./Gemfile exec ruby #{cmd}")
end
module Bundler
class << self
def with_sparkling_clean_env
oenv = ENV.to_hash
%w{BUNDLE_GEMFILE RUBYOPT GEM_HOME GIT_DIR GIT_WORK_TREE}.each { |key| ENV.delete(key) }
yield
ENV.replace(oenv)
end
end
end