【问题标题】:Bundler: You are trying to install in deployment mode after changing your GemfileBundler:您尝试在更改 Gemfile 后以部署模式安装
【发布时间】:2025-04-27 22:35:01
【问题描述】:

我对 bundler 和 capistrano 很陌生,我正在尝试将它们一起使用。当我尝试部署时,我收到消息:

您尝试在更改 Gemfile 后以部署模式安装。在别处运行 `bundle install' 并将更新的 Gemfile.lock 添加到版本控制中。

我不知道如何满足抱怨的系统,我不明白为什么会出现抱怨,因为我在the doc阅读:

如果 Gemfile.lock 确实存在,并且您已经更新了 Gemfile(5), bundler 将为所有 gem 使用 Gemfile.lock 中的依赖项 您没有更新,但会重新解决 gems 的依赖关系 你确实更新了。您可以找到有关此更新的更多信息 下面在保守更新下进行处理。

我将其解释为 Bundler 可以处理我的 Gemfile 与预期不同的事实。有什么帮助吗?

规格:Ruby 1.9.3、Rails 3.2.3、Capistrano 2.12.0、Bundler 1.1.4、Windows 7,部署到 Posix 机器。

编辑:我的 Gemfile 包含如下逻辑块:

unless RbConfig::CONFIG['host_os'] === 'mingw32'
  # gem 'a' ...
end

【问题讨论】:

    标签: ruby-on-rails capistrano bundler


    【解决方案1】:

    我不在乎。这就是我所做的。它修复了它。

    rm -rf .bundle 
    rm -rf Gemfile.lock
    bundle install
    

    【讨论】:

      【解决方案2】:

      我阅读了十几个关于不同资源的解决方案,但没有找到在这种情况下对我有帮助的确切方法

      所以我确实找到了解决方案。确切地说我仔细阅读了错误消息并且有一个解决方案:在其他地方运行捆绑安装。 “其他地方”是我开发应用程序的 Cloud9。所以我的步骤

      1. 使用rsync 命令将 Gemfile 和 Gemfile.lock 从服务器复制到本地计算机
      2. 将这两个文件插入我的 RoR 项目(我使用 Cloud9)
      3. 打开 Gemfile 并进行我想要的更改。就我而言,我添加了 gem 'thin'
      4. 在终端 cd 到我在 Cloud9 上的应用程序并运行 bundle install。在这种情况下,您将拥有一个 更改 版本的 Gemfile.lock
      5. 使用rsync在服务器上复制new Gemfile 和 Gemfile.lock
      6. cd 到我的应用程序文件夹并再次运行bundle install --deployment --without development test 完毕!祝大家好运!

      【讨论】:

        【解决方案3】:

        执行此命令后,您可以再次进行正常的捆绑安装:

        bundle install --no-deployment
        

        【讨论】:

        • 如果这是 capistrano 部署,请使用 set :bundle_config, { deployment: false }
        【解决方案4】:

        此问题可能与指向旧版本代码的子模块有关。对我来说,我通过更新子模块解决了这个问题

        如果您有子模块,请尝试运行:

        git submodule update --init

        bundle install

        【讨论】:

          【解决方案5】:

          我在尝试推送到 Heroku 时收到错误消息。我发现以下解决方案已修复。

          1. Git pull origin master
          2. Git 状态
          3. Git 提交
          4. git push origin master
          5. Git push heroku master

          【讨论】:

            【解决方案6】:

            注意全局 Bundler 配置。

            我在 ~/.bundle/config 的开发环境中有一个全局配置,但在我的 CI / 生产环境中没有,这导致在我的开发环境中生成的 Gemfile.lock 与我的 CI /生产环境。

            在我的情况下,我在我的开发环境中将github.https 设置为 true,但在我的 CI / 生产环境中没有这样的配置。这导致两个Gemfile.lock 文件不同。

            【讨论】:

            • 谢谢!在所有与这个荒谬错误有关的简单答案中——这就是让我重新开始工作的原因。为什么 Heroku 不自动辅助呢?失去生命最后 3 个小时的理由真是太糟糕了!
            • 你可能刚刚救了我的命。我正准备为此开枪:P
            • @JoshuaPinter,是的,这救了我!尽管花了几个小时在上面......但我试图纠正我在执行“捆绑安装”时收到的警告并被困在这个泡菜中。非常感谢!
            • @daveomcd 去过那里,很高兴它为您节省了几个小时的摸头。 :)
            【解决方案7】:

            这可能是一个危险的想法,但如果绝对必须在生产部署环境中测试某些东西,您可以编辑 .bundle/config 文件

            # This value is normally '1' 
            # Set it to '0'
            BUNDLE_FROZEN: '0'
            

            现在调用 bundle,在我的例子中我需要更新一个特定的 gem,所以这是我的命令

            RAILS_ENV=production bundle update <whatever gem>
            

            您可能应该在更新后将其改回,以便之后一切如您所愿。同样,这可能不受支持,并且 YMMV

            【讨论】:

              【解决方案8】:

              对于heroku,您不必更改Gemfile 中的语法。您可以将BUNDLE_GITHUB__HTTPS(注意双下划线)添加为环境变量并将其设置为true(在您的heroku 应用程序的仪表板中Settings 选项卡下的Config Vars 部分)。这会将所有此类请求的协议从 git:// 切换到 https://

              【讨论】:

                【解决方案9】:

                我的具体问题与@JoshPinter 报告的内容有关,即捆绑程序用于从 github 检索 gem 的协议中的 dev-vs-deploy 主机差异。

                长话短说,我只需要修改以下Gemfile 条目...

                gem 'activeadmin', github: 'activeadmin'
                

                ...到这个安全的语法(see reference):

                gem 'activeadmin', git: 'https://github.com/activeadmin/activeadmin.git'
                

                我的部署已经恢复正常。

                【讨论】:

                • 这也解决了我的问题。真奇怪。
                • 我正在研究一个旧的代码库。我在升级 ruby​​ 版本后遇到了这个问题。这解决了问题。
                【解决方案10】:
                rm -fr .bundle
                

                为我解决了问题。

                【讨论】:

                  【解决方案11】:

                  您收到有关Gemfile.lock 的错误消息可能是因为您的GemfileGemfile.lock 彼此不一致。自从上次运行 bundle install(或 update)后,您的 Gemfile 中似乎发生了一些变化。当您bundle install 时,它会使用您对 Gemfile 所做的任何更改来更新您的 Gemfile.lock。

                  确保您在本地运行 bundle install,然后签入以对您新更新的 Gemfile.lock 进行源代码控制。然后尝试部署。

                  编辑:正如 cmets 中所承认的,Gemfile 中的条件导致一个平台上的 Gemfile.lock 有效,而在另一个平台上无效。在 Gemfile 中为这些依赖于平台的 gem 提供 :platform 标志应该可以解决不对称问题。

                  【讨论】:

                  • 听起来是正确的答案,但我确实在我的开发机器上运行了 bundle install,然后将 Gemfile 及其锁定检查到 svn,然后使用 capistrano。问题可能是因为 Gemfile 包含一个块:unless RbConfig::CONFIG['host_os'] === 'mingw32'? (因此它应该在我的 windows 计算机上捆绑不同的项目而不是在 linux 服务器上。)
                  • 很有可能。检查 Gemfile.lock 的内容 - 它是否包含仅应包含在 Windows 上的引用 gem?如果是这样,这表明在部署机器上, Gemfile 和 Gemfile.lock 不同。 (另外,我不是 Bundler 专家,但我很确定在 Gemfile 中放置条件并不是最佳做法。考虑使用groups:platform flag)。
                  • 对我的 prod (posix) 服务器需要但不在我的 dev (win) 服务器上的 gem 使用 :platforms 标志会有所不同:platforms :ruby do; gem 'mygem'; ...; end(如果您不介意将此说明添加到您的答案中。)
                  • :platform 无法区分 linux 和/或 darwin env 使用:require,也很好用*.com/a/16475580/933358跨度>
                  • 这对我有用!谢谢你,让我摆脱了更多的挫折!
                  【解决方案12】:

                  我的解决方案与此处列出的其他解决方案略有不同。我试图从 sidekiq 升级到 sidekiq-pro(需要捆绑程序 1.7.12+),但我不断收到来自 travis-ci 的“您正在尝试在更改 Gemfile 后以部署模式安装”消息

                  检查 travis-ci 的控制台输出发现正在使用旧版本的捆绑程序。

                  就我而言,我必须编辑 travis.yml 文件以添加:

                  before_install: - gem update bundler

                  这迫使 travis-ci 使用最新版本的 bundler,并使错误消息消失。

                  【讨论】:

                  • 这对我在 Capistrano 下运行 cap shellgem update bundlerwith &lt;role&gt; gem update bundleron &lt;machine&gt; gem update bundler 有效
                  • 这里也一样。在 Jenkins 中,我们使用的是 bundler v2.2.9,而在本地我使用的是 v2.2.25。在 Jenkins 中更新捆绑器版本解决了这个问题......可能。我还解决了几个捆绑器弃用警告,例如,“--deployment 标志已被弃用,因为它依赖于在捆绑器调用中被记住,捆绑器在未来的版本中将不再这样做。”,所以也许这也有一些影响。
                  【解决方案13】:

                  在我们的例子中,我们使用了在我们的生产机器上运行的旧版本捆绑器中不可用的功能。因此升级捆绑器就足够了,即做一个gem update bundler

                  【讨论】:

                  • 谢谢 - 我也有这个问题。结果发现服务器上的 bundler 版本比我们在桌面上使用的版本旧。
                  【解决方案14】:

                  vi .bundle/config

                  将 BUNDLE_FROZEN 选项从“1”更改为“0”

                  执行“捆绑安装”


                  运行“捆绑配置”

                  查看“冻结”值是否为真,将其设置为假

                  捆绑配置冻结错误

                  【讨论】:

                  • 这就是为我做的。有趣的是,在配置文件本身中,键 BUNDLE_FROZEN 根本没有设置。我想知道,我是否有可能在其他地方设置了 BUNDLE_FROZEN: 1?
                  • bundle config frozen false 是我的 goto 修复。非常感谢,两年了!我相信 Joshua Pinter 的回答解决了上述评论 - 它可能是影响这一点的全局 Bundler 配置。
                  • bundle config frozen false 对我没有任何帮助。求助于编辑 .bundle/config 其中条目 BUNDLE_FROZEN = "true" (textual true)
                  【解决方案15】:

                  我遇到了类似的问题,但是我同时执行了 bundle installbundle update 并且 Heroku 仍然拒绝了我的推送。

                  我通过删除 Gemfile.lock 然后再次运行 bundle install 解决了这个问题。然后我添加、提交并将其推送到我的 git 存储库。在那之后,我毫无问题地推送到 Heroku。

                  【讨论】:

                  • 除非您在 gemfile 中修复了 gem 版本,否则这是有风险的。它可能会更新 gem 并破坏您的应用程序
                  【解决方案16】:

                  另一个错误原因:

                  这有点愚蠢,但我相信其他人也会犯同样的错误。

                  对于 Rails 4,Heroku 添加了 gem rails_12factor。如果您在他们添加之前使用它,那么您将拥有这两个宝石:

                  gem 'rails_log_stdout',  github: 'heroku/rails_log_stdout'
                  gem 'rails3_serve_static_assets', github: 'heroku/rails3_serve_static_assets'
                  

                  您必须在添加新的时删除它们。 (包括在内)。我认为你可以摆脱它,直到你在 gem 文件中触摸它们,然后 Heroku 会注意到重复并因上述错误而大喊大叫。

                  祝 Rails 4 好运。

                  【讨论】:

                    【解决方案17】:

                    在一些 gem 更新后,我在部署 Nesta 应用程序时遇到了这个问题。对我有用的是删除 Gemfile.lock,运行 bundle install 重新生成它,然后再次部署。

                    【讨论】:

                      【解决方案18】:

                      当你看到以下...

                      $ bundle install
                      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`.
                      
                      You have added to the Gemfile:
                      * source: rubygems repository https://rubygems.org/
                      * rails (~> 3.2)
                      . . .
                      

                      ...那么,问题很可能是您的供应商/缓存目录中的 .gem 文件已过时。

                      也许,您之前运行过 $bundle install --deployment,它会将一些“过时”的 .gem 文件放入缓存中?

                      无论如何,您都可以通过运行:bundle install --no-deployment

                      来解决此错误

                      这是 Rails 的众多优点之一...错误消息通常会告诉您如何解决问题。

                      【讨论】:

                        【解决方案19】:

                        我以前遇到过类似的事情。我认为修复它的一种方法是运行

                        bundle install --deployment 
                        

                        然后尝试部署。这就像将所有 gem 安装到供应商文件夹中一样,我认为通常可以避免这种情况......但仍然可能有效。我的应用程序曾经像这样运行,我的解决方案是从我的 Gemfile 中删除要下载的确切版本,然后重新捆绑和部署。

                        gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git', :branch => 'master'
                        

                        gem 'rails_admin'
                        

                        或者你可以按照它的建议去做,把你的项目从生产服务器上Git到本地机器上,捆绑它,然后重新推送到你的服务器上。这个解决方案可能不是 100% 正确,但其中一些对我有用……只是想我会分享。祝你好运

                        【讨论】:

                        • --deployment 标志没有任何区别,除非我删除了 Gemfile.lock。应该是这样吗?