ChatGPT解决这个技术问题 Extra ChatGPT

Bundler:您尝试在更改 Gemfile 后以部署模式安装

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

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

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

如果 Gemfile.lock 确实存在,并且您已更新 Gemfile(5),则捆绑程序将使用 Gemfile.lock 中的依赖项来处理您未更新的所有 gem,但将重新解析您更新的 gem 的依赖项.您可以在下面的保守更新下找到有关此更新过程的更多信息。

我将其解释为 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

K
Kick Buttowski

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

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

编辑:正如评论中所承认的,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 无法使用 :require 区分 linux 和/或 darwin env,也可以正常工作 stackoverflow.com/a/16475580/933358
这对我有用!谢谢你,让我摆脱了更多的挫败感!
G
Gaurav Ingalkar

vi .bundle/配置

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

做“捆绑安装”

或者

运行“捆绑配置”

查看“冻结”值是否为 true 将其设置为 false

捆绑配置冻结错误


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

注意全局 Bundler 配置。

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

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


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

当你看到以下...

$ 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 的众多优点之一……错误消息通常会准确地告诉您如何解决问题。


G
Giuseppe

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

长话短说,我所要做的就是修改以下 Gemfile 条目...

gem 'activeadmin', github: 'activeadmin'

...对于这种安全语法 (see reference):

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

我的部署恢复正常。


这也解决了我的问题。真的很奇怪。
我正在研究一个旧的代码库。我在升级 ruby 版本后遇到了这个问题。这解决了问题。
W
William Entriken

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

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

是的...这也是我所做的。之后还添加了捆绑锁 --add-platform x86_64-linux 并且它有效
d
dacoinminster

我的解决方案与此处列出的其他解决方案略有不同。我试图从 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 <role> gem update bundleron <machine> gem update bundler 有用
同样在这里。在 Jenkins 中,我们使用的是 bundler v2.2.9,而在本地我使用的是 v2.2.25。在 Jenkins 中更新 bundler 版本解决了这个问题......可能。我还解决了几个捆绑器弃用警告,例如,“--deployment 标志已被弃用,因为它依赖于在捆绑器调用中被记住,捆绑器在未来的版本中将不再这样做。”,所以也许这也有一些影响。
A
Aneil Mallavarapu
rm -fr .bundle

为我解决了这个问题。


g
givanse

错误的另一个原因:

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

对于 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 好运。


S
ServerElf

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

bundle install --no-deployment

如果这是 capistrano 部署,请使用 set :bundle_config, { deployment: false }
谢谢!这是唯一对我有用的东西,在我更新了部署机器中的 ruby 版本并通过 capistrano 捆绑安装停止工作之后。
M
MoB

我之前遇到过类似的事情。我认为解决它的一种方法是运行

bundle install --deployment 

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

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

gem 'rails_admin'

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


除非我删除了 Gemfile.lock,否则 --deployment 标志没有任何区别。这就是它应该的方式吗?
n
nerdinand

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


谢谢 - 我也有这个问题。结果发现服务器上的捆绑器版本比我们在台式机上使用的版本旧。
C
Chewbarkla

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

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

现在调用 bundle,在我的情况下我需要更新一个特定的 gem,所以这是我的命令

RAILS_ENV=production bundle update <whatever gem>

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


Y
Yarin

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


R
Ryan Rich

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

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


除非您在 gemfile 中修复了 gem 版本,否则这是有风险的。它可能会更新 gem 并破坏您的应用程序
c
clairity

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


B
Ben Strachan

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

Git pull origin master Git status Git commit Git push origin master Git push heroku master


G
Gerard Simpson

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

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

git submodule update --init

bundle install


V
Vitaliy LiBrus

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

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

使用 rsync 命令将 Gemfile 和 Gemfile.lock 从服务器复制到本地机器将这两个文件插入我的 RoR 项目(我使用 Cloud9)打开 Gemfile 并进行我想要的更改。就我而言,我将终端 cd 中的 gem 'thin' 添加到 Cloud9 上的应用程序并运行捆绑安装。在这种情况下,您将使用 rsync cd 在服务器上复制新的 Gemfile.lock 和 Gemfile.lock 的更改版本到我的应用程序文件夹,然后再次运行 bundle install --deployment --without development test DONE!祝大家好运!


h
helvete

windows 10 (rails v-7) 中命令 bundle install 的错误消息类似于

You are trying to install in deployment mode after changing
your Gemfile. Run `bundle install` elsewhere and add the
If this is a development machine, remove the C:/Users/friends/Gemfile freeze
by running `bundle config unset deployment`.

The dependencies in your gemfile changed

You have added to the Gemfile:
* pg

You have deleted from the Gemfile:
* sqlite3 (~> 1.4)

所以我完全按照错误信息要求我做。运行以下命令

bundle config unset deployment

然后我再次运行`bundle install 然后它工作了


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅