【问题标题】:How to tell Bundler to use gems installed systemwide (production deployment)?如何告诉 Bundler 使用系统范围内安装的 gems(生产部署)?
【发布时间】:2013-02-12 15:38:34
【问题描述】:

使用 Capistrano 部署 Rails 应用程序时,我希望 Bundler 仅在找不到已在系统范围内安装的 gem 时将 gem 安装到 shared/bundles 目录。我该怎么做?

例如,如果我已经在系统上安装了 pg gem v 0.14,我希望 Bundler 使用它,而不是在我的应用程序的 shared/bundles 目录中构建和安装新的。

我正在使用 Ubuntu Server,并且为多个用户安装了 RVM。

【问题讨论】:

    标签: ruby-on-rails rubygems rvm capistrano bundler


    【解决方案1】:

    Bundler 允许使用 shared(rubygems) 和 vendored(bundler) gems,默认情况下 bundler/capistrano 配置为:

    set :bundle_flags, "--deployment --quiet"
    

    仅强制出售宝石,

    您可以通过显式切换回共享 gem:

    set :bundle_flags, "--system --quiet"
    

    仍然安装在vendor,但也使用共享gem:

    set :bundle_flags, "--path #{shared_path}/bundles --quiet"
    

    如果部署已经使用--deployment(默认)运行,那么它可以帮助运行一次部署:

    set :bundle_flags, "--no-deployment"
    

    【讨论】:

    • 只是为了确保:current/ 中没有 vendor/bundle 目录。就我而言,所有的 gem 都安装在 shared/bundles 中,它在 current/ 之外。这是否意味着我应该在您建议的最后一行代码中改用--path shared/bundles
    【解决方案2】:

    这实际上是 Bundler 的一个特性,本质上是依赖隔离——你不希望你的应用依赖于像这样的外部系统 gem。更新系统 gem 可能会对正在运行的应用程序产生影响。

    如果你已经在使用 capistrano,你应该在你的脚本中使用require "bundler/capistrano",这将把它们安装在shared/bundles 中。您也可以事先查看包装:http://gembundler.com/v1.2/bundle_package.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      相关资源
      最近更新 更多