2

我正在尝试组合一个快速的 Sinatra 应用程序来调用一些需要自己的 Bundler env 运行的测试 ruby​​ 脚本。

在我的 Sinatra 应用程序中形成一个方法,我想运行类似的东西

system("cd /test_app/; bundle exec ruby some_file.rb")

由于捆绑程序设置其环境的方式,这不起作用。有没有办法启动一个新的 shell 会话来执行我的脚本,以便它可以从 Sinatra 工作?

还是有其他方法可以做到这一点?基本上我唯一的要求是可以从网页上的链接触发这些脚本,以便一些团队成员可以启动测试过程。

4

2 回答 2

1

发现这个片段可以很好地清理捆绑器环境。- 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
于 2012-07-23T14:51:01.990 回答
1

这似乎有效:

Dir.chdir "/test_app"
`bundle exec ruby some_file.rb`

rvm use ruby-1.9.2-p320在我开始使用 sinatra 之前,我还需要获得正确的红宝石。rvm 不喜欢被告知在 ruby​​ 进程中改变自己。(这是有道理的!)

(使用反引号而不是 system() 您可以返回输出,以便您可以打印它或诸如此类。)

于 2012-07-16T17:33:19.050 回答