【问题标题】:Run a bundler-deployed Ruby app outside of its own directory?在自己的目录之外运行捆绑器部署的 Ruby 应用程序?
【发布时间】:2011-07-31 13:48:07
【问题描述】:

我正在编写一个基于 Ruby 的守护程序,以便在我的一台 Ubuntu 服务器上运行。我希望它在启动时运行,因此将为它编写一个新贵的作业文件。但是,我使用 bundler 来管理它使用的各种 gem,并打算在将其部署到服务器后执行此操作:

bundle install --deployment

这将 bundler 置于所谓的“部署模式”,其中设置了各种选项,所有 gem 都安装到“供应商”目录而不是系统范围内。然而,这会产生运行它的问题,因此它必须从它自己的目录中执行,因为这是 gems 的最终位置:

<in the app's dir>
$ ./runmyapp
<it runs>

如果我 cd 到另一个位置,然后尝试使用它的完整路径运行它,它会失败:

<in another directory>
$ /path/to/runmyapp
<it crashes as it can't locate its gems>

我已经阅读了很多捆绑程序文档,但从未涵盖整个场景?我应该只将 gem 安装到系统中吗?还有什么我应该做的吗?

【问题讨论】:

    标签: ruby rubygems bundler


    【解决方案1】:

    您使用 bundler 作为应用程序的 gem 管理器。我认为在这种情况下使用bundle exec 是运行可执行文件的最佳方式。

    如果您从与包含 Gemfile 的目录不同的目录运行您的应用程序,您应该通过设置 BUNDLE_GEMFILE 来设置 Gemfile 位置(请参阅bundle help exec)。以下将为您提供帮助:

    BUNDLE_GEMFILE=/path/to/Gemfile bundle exec /path/to/runmyapp
    

    【讨论】:

    • 我认为bundle exec 用于在 gems 中执行可执行文件。也就是说,捆绑器基于 gemfile 为我的应用程序安装的 gem,但不是我自己的。这不是真的吗?
    • bundle exec 用于在您的 gems 环境中运行可执行文件。来自gembundler.com/man/bundle-exec.1.html的引用:bundle-exec - Execute a command in the context of the bundle
    • 嗯,我读它的方式,它暗示它是由 gems 本身提供的可执行文件。但是,只需使用 BUNDLE_GEMFILE 变量集正常运行它就足够了 - 我刚刚更新了 upstart 配置以设置该变量。因此,我认为这是公认的答案。感谢您为我指明正确的方向。
    • 在使用ENV["BUNDLE_GEMFILE"] = "/path/to/Gemfile" 之前在脚本中设置这个Bundler.setup 也可以正常工作。
    【解决方案2】:

    我自己解决了一个类似的问题,我最终创建了一个包装脚本,

    #!/bin/bash
    BUNDLE_GEMFILE="$(dirname $0)"/Gemfile bundle exec ruby "$(dirname $0)"/app.rb $*
    

    这里的app.rb 是应用程序的“主要”入口点。您可以调用包装脚本 runmyapp 或应用程序的名称或其他名称。

    注意:$0 由 bash 设置为包装脚本的文件位置,例如/home/foo/app/runmyapp./runmyapp

    bundle exec "执行命令,使 Gemfile 中指定的所有 gem 都可以在 Ruby 程序中使用。" (docs)

    【讨论】:

      【解决方案3】:

      这里有一些很好的答案,但我想我会添加一个适用于我的场景的快速答案,我通过调用Bundler.require 明确设置Bundler,并且不经常执行通过bundle exec编写脚本。

      如果您这样做,并且Gemfile/Gemfile.lock 文件与脚本位于同一目录中,您可以像这样使用Dir.chdirKernel.__dir__ 的组合:

        Dir.chdir(__dir__) { Bundler.require }
      

      这可以通过在返回原始目录之前将调用的目录更改为Bundler.require(因为这期望相关文件存在于当前工作目录中)来实现。

      【讨论】:

        猜你喜欢
        • 2020-09-22
        • 1970-01-01
        • 2018-03-30
        • 2018-03-26
        • 2023-03-09
        • 2012-01-02
        • 1970-01-01
        • 2013-09-10
        • 1970-01-01
        相关资源
        最近更新 更多