【问题标题】:Unable to update gems on production server无法更新生产服务器上的 gem
【发布时间】:2011-10-10 18:25:00
【问题描述】:

无法在生产服务器上更新 gem。

我试过bundle install --deployment 和bundle install --without development test

但不断得到:

You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
updated Gemfile.lock to version control.

If this is a development machine, remove the Gemfile freeze 
by running `bundle install --no-deployment

编辑

我不知道这是否正确,但需要快速修复。我跑了bundle install --no-deployment 然后bundle update 然后又跑了bundle install --deployment

【问题讨论】:

    标签: ruby ruby-on-rails-3 rubygems


    【解决方案1】:

    说明可能有点混乱。意思是您在开发机器上修改了Gemfile,只是推送了这些更改,而不是在提交更改之前运行bundle install。

    通过运行bundle install,您将更新您的Gemfile.lock 文件。这应该被推送到您的服务器,因为它比Gemfile 更重要。考虑Gemfile 文件的计划Gemfile.lock。

    永远记住:

    1. 如果您更改了Gemfile,请运行bundle install,即使只是为了确保。如果速度太慢,请传递 --local 以强制它仅使用本地 gem 来解决其依赖关系。
    2. 将Gemfile 和Gemfile.lock 文件同时提交到您的存储库
    3. 将Gemfile 和Gemfile.lock 部署到您的生产服务器,以确保它们运行的​​依赖项与您的开发环境完全相同。

    单独运行bundle update 可能被认为是危险的,它会更新所有应用程序的依赖项。如果您没有在Gemfile 中指定可靠的版本号,这主要是危险的。我wrote about it here.

    【讨论】:

    • 好的,我认为它开始有意义了。我确实跳过了 Gemfile.lock 认为既然服务器是生产服务器,我应该更多地依赖它。所以我的错误是没有上传 gemfile.lock?幸运的是,如果我必须重建服务器,我还处于早期阶段。
    • 虽然我的Gemfile 和Gemfile.lock 是同步的,但我遇到了同样的错误。我什至尝试删除Gemfile.lock 并通过运行bundle install 重新生成它。但是新的Gemfile.lock 一点一点都一样。
    • 您可能已经更改了 Gemfile 而没有触发 Gemfile.lock 的更改。当我在测试组和开发组之间移动一些东西时,这发生在我身上。我最终不得不做出一个确实触发了 Gemfile.lock 更改的更改,以使它们重新同步(从捆绑器的角度来看)。
    【解决方案2】:

    FWIW 我遇到了这个问题,并通过从我的 Gemfile 中删除一些条件语句(操作系统上的条件)并重新运行包来解决它。

    【讨论】:

    • 我对 Ryan 上面回答的评论可能是相关的。
    • 你能解释一下conditional statements是什么意思
    【解决方案3】:

    仅供参考:如果您使用这样的源代码块,您也可能会收到此错误:

    source 'https://rails-assets.org' do
      gem 'rails-assets-jquery'
    end
    

    您会在 Gemfile.lock 中看到此 gem 的感叹号:

      rails-assets-jquery!
    

    正常定义附加源即可,即

    source 'https://rails-assets.org'
    gem 'rails-assets-jquery'
    

    (顺便说一句,请参阅here 关于使用多个 gem 源。)

    【讨论】:

    • 根据提到的文章,使用source 的非阻塞版本是不安全的。有没有办法使用块版本?
    • @Besi 我不知道,但是 Bundler 应该发出警告。当它发生时,我计划在相关 gem 上添加显式 :source 选项。
    • 如果您正在阅读本文并想知道发生了什么。我的生产服务器系统 ruby​​ 仍然是 1.9.3,带有一个过时的 bundler 版本。当使用 source 作为块或 gem 上的键时,我得到了这个错误。通过将其定义为附加源,我摆脱了 Jim Flood 提到的感叹号,并且部署成功。我假设旧版本的捆绑器根本无法处理源块或源哈希表示法。
    • 使用source 块解决此问题的另一种(可能更好)方法是确保您的捆绑器版本在开发/生产服务器之间同步。我在开发盒上运行 bundler 1.7.7 和在生产服务器上运行 1.7.1 时遇到了这个问题。将两者都更新到 1.10.4 解决了这个问题。
    【解决方案4】:

    这可能是由于您要部署到的服务器(在本例中为生产环境)上旧版本的 bundler gem 造成的。登录到服务器并运行gem update bundler 为我解决了这个问题。我部署到的服务器运行的是 1.7.4 版本,当前版本是 1.9。

    【讨论】:

    • 唯一对我有用的东西。我已经删除了Gemfile.lock 并再次生成它,但在服务器中仍然保留旧版本。非常感谢!
    【解决方案5】:

    我的生产服务器仍然使用旧版本的 gem,尽管 Gemfile.lock 显示了正确的更新版本,但我遇到了问题。我的生产服务器在 Unicorn 上运行 - 关闭/重新启动它可以解决问题 - 而不是发送 HUP 信号,这确实解决了问题。

    【讨论】:

    • 感谢您的提示。也正是我的问题所在。
    • 哇。我花了最后一个错误来尝试与您的情况相同的情况(旧宝石)。我希望我早点尝试过。谢谢!
    【解决方案6】:

    由于 osx 上的 mysql-gem,捆绑安装在我的“开发”机器上失败...

    我还需要快速修复。所以我将 repo 克隆到生产机器上的一个新文件夹,在那里运行“捆绑安装”并将 Gemfile.lock 提交给 repo。

    【讨论】:

    • 就是这样的东西让我非常讨厌 bundler
    【解决方案7】:

    我遇到过这个问题(Ubuntu 12.10 和 12.04,其中一个在代理服务器后面)。 我的问题是我在 Gemfile 中有一些 git:// 协议。将其更改为 http:// 帮助我完成了所有工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-03
      • 2023-03-23
      相关资源
      最近更新 更多