【问题标题】:Sinatra exec/system 'bundler exec'Sinatra 执行/系统“捆绑程序执行”
【发布时间】:2012-07-16 15:56:45
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 应该喜欢我正在尝试的,不成功。我有一个 Rails 应用程序,我想通过使用该脚本包调用自定义 ruby​​ 脚本......但我不断获得 Rails 应用程序的包。

标签: ruby shell sinatra bundler


【解决方案1】:

这似乎有效:

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

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

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

【讨论】:

  • 我遇到了同样的问题,但这对我不起作用。请参阅我对问题的评论以阅读我正在尝试的确切内容。
  • 我现在得到了这个工作,但是将你的 cd 技巧与 Bundler.with_clean_env 结合起来......
  • aha - 你想要你自己的脚本包和应用程序的 Rails 应用包。
  • 没错。我也读了原始问题的意思,但我可能是错的。我对这个解决方案的唯一问题是它在调用方。我无法使用 cmd-line ruby​​ 脚本来强制执行它自己的包。
【解决方案2】:

发现这个 sn-p 可以很好地清理 bundler 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    • 2023-03-08
    • 2011-02-11
    • 2015-02-12
    相关资源
    最近更新 更多