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


86

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

更改Gemfile后,您尝试以部署模式安装。在其他地方运行“捆绑安装”,然后将更新的Gemfile.lock添加到版本控制中。

我不知道如何使投诉的系统满意,并且我不明白为什么会提出投诉,因为我在doc中阅读过:

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

我将其解释为意味着Bundler可以处理我的Gemfile超出预期的事实。有什么帮助吗?

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

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

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

Answers:


80

您收到的错误消息Gemfile.lock可能是由于您GemfileGemfile.lock彼此之间的不同意见。自上次运行bundle install(或update)以来,您似乎已经更改了Gemfile中的某些内容。当您使用时bundle install,它将使用您对Gemfile所做的任何更改来更新Gemfile.lock。

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

编辑:如评论中所识别,Gemfile中的条件导致在一个平台上有效的Gemfile.lock在另一个平台上无效。在Gemfile中为这些平台相关的gem提供:platform标志可以解决不对称性。


2
听起来像是正确的答案,但我确实在开发机器上运行了bundle install,然后检查了Gemfile及其对svn的锁定,然后使用了capistrano。可能是因为Gemfile包含一个带有以下内容的块unless RbConfig::CONFIG['host_os'] === 'mingw32'吗?(因此,它应该在Windows计算机上与在Linux服务器上捆绑不同的项目。)
JellicleCat 2012年

1
很有可能。检查Gemfile.lock的内容-它是否包含仅在Windows上包含的引用gem?如果是这样,则表明在部署计算机上,Gemfile和Gemfile.lock不同。(而且,我也不是Bundler专家,但是我敢肯定,将条件条件放入您的Gemfile中不是最佳实践。请考虑使用:platform标志)。
Edd Morgan

2
使用:platforms我的prod(posix)服务器所需但不是我的dev(win)服务器上的gem的标志进行区别:(platforms :ruby do; gem 'mygem'; ...; end如果您不介意将此说明添加到答案中,则会得到绿色的确认。)
JellicleCat 2012年

:平台是无法区分的Linux和/或达尔文使用ENV :require,效果很好太stackoverflow.com/a/16475580/933358
丹尼尔W.康普顿

这对我有用!谢谢,让我摆脱了更多的挫折感!
thenextmogul 2015年

26

vi。捆绑/配置

将BUNDLE_FROZEN选项从'1'更改为'0'

做“捆绑安装”


要么

运行“捆绑配置”

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

捆绑配置冻结false


这就是为我做的。有趣的是,在配置文件本身中,根本没有设置键BUNDLE_FROZEN。我想知道,是否可能在其他地方设置了BUNDLE_FROZEN:1?
Bo G.

bundle config frozen false是我的解决方法。非常感谢,两年过去了!我相信Joshua Pinter的回答解决了上面的评论-可能是全球Bundler配置影响了这一点。
SRack

bundle config frozen false没有为我做任何事。借助编辑.bundle / config的方式,其中条目BUNDLE_FROZEN =“ true”(文本真实)
Arthur

19

注意全局的Bundler配置。

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

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


2
谢谢!与这个可笑的错误有关的所有简单答案中的任何一个-这就是让我重新开始工作的原因。为什么Heroku不会自动对此进行辅助?失去我生命的最后三个小时真是me脚!
坏人

2
您可能只是救了我的命。我正准备为此射击自己:P
泰隆·威尔逊

1
@JoshuaPinter,是的,这救了我!尽管花了几个小时。非常感激!
daveomcd '17

1
@daveomcd在那里,很高兴它为您节省了数小时的挠头工作。:)
约书亚·品特

11

当您看到以下内容时...

$ 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)
. . .

...然后,问题很可能是您的vendor / cache目录中的.gem文件已过时。

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

无论如何,您可以通过运行以下命令来解决此错误: bundle install --no-deployment

那是Rails的众多优点之一。错误消息通常会告诉您确切的解决方法。


7

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

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

gem 'activeadmin', github: 'activeadmin'

...对此安全语法(请参阅参考资料):

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

而且我的部署已恢复正常。


这也为我解决了问题。真的很奇怪
约书亚·穆海姆

6

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

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

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

before_install: - gem update bundler

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


这Capistrano的下为我工作的运行cap shellgem update bundlerwith <role> gem update bundleron <machine> gem update bundler
埃里克

4

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

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


1

我之前遇到过类似的情况。我认为,解决此问题的一种方法是运行,但可能会在服务器上占用比您所需更多的空间

bundle install --deployment 

然后尝试部署。这样做就像将所有gems安装到vendor文件夹中一样,我相信通常可以避免...但是仍然可以使用。我的应用程序以前是这样的,我的解决方案是删除要从我的Gemfile中下载的确切版本,然后重新打包和部署。

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

gem 'rails_admin'

或者,您可以按照建议的方式进行操作,然后将项目从生产服务器上Git到本地计算机上,将其捆绑,然后重新推送到服务器上。这个解决方案可能不是100%正确,但是其中一些对我有用...只是以为我会分享。祝好运


1
--deployment除非删除了Gemfile.lock,否则该标志不会有任何变化。那是应该的样子吗?
JellicleCat 2012年

1

错误的另一个原因:

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

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


1

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


谢谢-我也有这个问题。原来,服务器上的捆绑器版本比我们在台式机上使用的捆绑器版本旧。
内森·伯特拉姆

1

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

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

现在调用bundle,就我而言,我需要更新特定的gem,因此这是我的命令

RAILS_ENV=production bundle update <whatever gem>

您可能应该在更新后将其更改回原来的位置,以便事后按预期工作。同样,这可能不受支持,并且YMMV


0

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


0

我遇到了类似的问题,但是我做了两个bundle install,并bundle update与Heroku上仍然拒绝了我的推动。

我通过删除Gemfile.lock然后bundle install再次运行来解决此问题。然后,我添加,提交并推送到我的git repo中。之后,我毫无疑问地推向Heroku。


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

0

对于heroku,您无需更改中的语法Gemfile。您只需添加BUNDLE_GITHUB__HTTPS(请注意双下划线)作为环境变量并将其设置为trueSettings在该Config Vars部分的标签下的heroku应用的信息中心中)。这会将所有此类请求的协议从git://切换https://为。


0

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

  1. Git拉起源大师
  2. git状态
  3. Git提交
  4. Git Push Origin Master
  5. Git推Heroku大师

0

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

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

git submodule update --init

bundle install


0

执行此命令后,您可以再次进行常规捆绑软件安装:

bundle install --no-deployment

0

我在不同的资源上阅读了十几种解决方案,但在这种情况下找不到确切的解决方案

所以我确实找到了解决方案。确切地说,我专心阅读了错误消息,并且有解决方法:在其他地方运行bundle install。“其他地方”是我开发应用程序的Cloud9。所以我的脚步

  1. 使用rsync命令将Gemfile和Gemfile.lock从服务器复制到本地计算机
  2. 将这两个文件插入我的RoR项目(我使用过Cloud9)
  3. 打开Gemfile并进行我想要的更改。就我而言,我添加了宝石“稀薄”
  4. 在终端cd上到Cloud9上的我的应用程序并运行bundle install。在这种情况下,您将拥有Gemfile.lock的更改版本。
  5. 使用以下命令在服务器上复制新的Gemfile和Gemfile.lockrsync
  6. cd到我的应用程序文件夹,然后再次运行 bundle install --deployment --without development test DONE!祝大家好运!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.