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

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

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

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

如果Gemfile.lock确实存在,并且已经更新了Gemfile(5),bundler将使用Gemfile.lock中的依赖关系来处理所有未更新的gem,但会重新parsing您更新的gem的依赖关系。 您可以在CONSERVATIVE UPDATING下find更多关于此更新过程的信息。

我认为这意味着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 

你得到关于Gemfile.lock的错误信息可能是因为你的GemfileGemfile.lock不一致。 这听起来像你自上次运行bundle install (或update )以来,已经在Gemfile中更改了某些内容。 当你bundle install ,它会更新你的Gemfile.lock与您对Gemfile所做的任何更改。

确保你在本地运行bundle install ,然后检查你的新更新的Gemfile.lock 。 然后尝试部署。

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

vi .bundle / config

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

做“捆绑安装”


要么

运行“捆绑configuration”

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

捆绑configuration冻结错误

注意全局的Bundlerconfiguration。

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

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

当你看到以下…

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

…然后,问题很可能是您的供应商/caching目录中存在过期的.gem文件。

也许,你以前运行过$bundle install --deployment –deployment,在caching中放置了一些“过时”的.gem文件?

在任何情况下,您都可以通过运行以下命令来解决此错误: bundle install --no-deployment

这是Rails许多伟大的事情之一…错误消息经常告诉你如何解决这个问题。

我的解决scheme与此处列出的其他解决scheme略有不同。 我试图从sidekiq升级到sidekiq-pro(这需要捆绑1.7.12 +),但我不断得到“你正试图安装在部署模式后更改您的Gemfile”消息从Travis-ci

检查travis-ci的控制台输出结果显示使用的是旧版本的bundler。

在我的情况下,我不得不编辑travis.yml文件来添加:

before_install: - gem update bundler

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

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

长话短说,我只需要修改下面的Gemfile条目…

 gem 'activeadmin', github: 'activeadmin' 

…这个安全的语法( 见参考 ):

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

我的部署恢复正常。

我遇到过类似的事情。 解决这个问题的方法之一,我认为,但可能需要更多的空间在你的服务器上,而不是你想要的,就是运行

 bundle install --deployment 

然后尝试部署。 这样做就像把所有的gem安装到供应商文件夹,我相信通常是很好的避免…但仍然可能工作。 我的应用过去像这样,我的解决scheme是从我的Gemfile中删除精确的版本,然后重新绑定和部署。

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

 gem 'rails_admin' 

或者你可以做它build议的事情,把你的项目从生产服务器上拖到本地机器上,捆绑它,然后重新安装到你的服务器上。 这个解决scheme可能不是100%正确的,但其中一些对我来说是工作的…只是以为我会分享。 祝你好运

错误的另一个原因是:

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

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

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

你添加新的时候你必须删除它们。 (他们包括在内)。 我认为你可以逃避,直到你碰到你的gem文件中的行,然后Heroku注意到重复,并与上述错误哭出来。

祝你好运与Rails 4。

在我们的例子中,我们使用的是在我们的生产机器上运行的旧版本的捆绑器中没有的function。 因此,升级捆绑器就足够了,也就是做一个gem update bundler

 rm -fr .bundle 

解决了我的问题。

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

我碰到类似的问题,但我bundle installbundle update和Heroku仍然拒绝我的推。

我通过删除Gemfile.lock然后再次运行bundle install 。 然后,我添加,承诺,并推到我的git回购。 之后我没有问题推到Heroku。

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

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

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

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

 RAILS_ENV=production bundle update <whatever gem> 

更新之后,你应该把它改回来,所以事情就像你期待的那样。 再次,这可能是不受支持的,YMMV

试图推送到Heroku时,我有错误信息。 我发现以下解决scheme已修复。

  1. Git拉来源大师
  2. Git状态
  3. Git提交
  4. Git推送起源大师
  5. Git推heroku高手