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

时间:2012-07-16 22:39:06

标签: ruby-on-rails capistrano bundler

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

  

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

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

  

如果Gemfile.lock确实存在,并且您已更新Gemfile(5),   bundler将使用Gemfile.lock中的依赖项来获取所有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

19 个答案:

答案 0 :(得分:69)

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

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

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

答案 1 :(得分:24)

vi .bundle / config

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

做“捆绑安装”

OR

运行“bundle config”

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

bundle config frozen false

答案 2 :(得分:18)

注意全球Bundler配置。

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

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

答案 3 :(得分:10)

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

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

答案 4 :(得分:5)

我的解决方案与此处列出的其他解决方案略有不同。我试图从sidekiq升级到sidekiq-pro(需要捆绑器1.7.12+),但我一直得到#34;你正在尝试在更改你的Gemfile之后在部署模式下安装"来自travis-ci的消息

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

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

items1.name = "item1"; items2.name = "item2"; items1.save(); items2.save(); List<Item> queryResults = new Select().from(Item.class).execute(); aToDoAdapter = new ItemAdapter(this, (ArrayList<Item>) queryResults);

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

答案 5 :(得分:4)

我的具体问题与@JoshPinter报告的内容有关,即dev-vs-deploy主机在bundler用于从github检索gems的协议中存在差异。

总而言之,我只需要修改以下 #s.source_files = "all" #s.resources = "some" s.subspec 'CoreData' do |sp| sp.source_files = "all" sp.resources = "some" sp.exclude_files = ... end s.subspec 'Realm' do |sp| sp.source_files = "all" sp.resources = "some" sp.exclude_files = ... end 条目......

Gemfile

...使用此安全语法(see reference):

gem 'activeadmin', github: 'activeadmin'

我的部署恢复正常。

答案 6 :(得分:3)

rm -fr .bundle

为我解决了这个问题。

答案 7 :(得分:1)

在我们的案例中,我们使用的是在我们的生产机器上运行的旧版Bundler中无法使用的功能。因此,升级捆绑包就足够了,即执行gem update bundler

答案 8 :(得分:1)

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

,但服务器上的空间可能比你想要的多
bundle install --deployment 

然后尝试部署。这有点像将所有宝石安装到供应商文件夹中,我认为通常很好避免......但仍然可能有效。我的应用程序曾经表现得像这样,我的解决方案是从我的Gemfile中删除要下载的确切版本,然后重新绑定和部署。

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

gem 'rails_admin'

或者你可以做它的建议,把你的项目从生产服务器上Git到本地机器上,捆绑它,然后重新注入你的服务器。这个解决方案可能不是100%正确,但其中一些对我有用...只是想我会分享。古德勒克

答案 9 :(得分: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'

添加新照片时必须将其删除。 (他们被包括在内)。我认为你可以逃脱它,直到你在你的宝石文件中触摸它们的行,然后Heroku注意到重复并发出上述错误。

祝你好运Rails 4。

答案 10 :(得分: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

答案 11 :(得分:1)

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

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

答案 12 :(得分:0)

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

我通过删除Gemfile.lock然后再次运行bundle install来修复此问题。然后我添加,承诺并将其推送到我的git repo。在那之后,我没有问题推向Heroku。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

尝试推送到Heroku时出现错误消息。我找到了以下解决方案。

  1. Git pull origin master
  2. Git status
  3. Git commit
  4. Git push origin master
  5. Git push heroku master

答案 16 :(得分:0)

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

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

git submodule update --init

bundle install

答案 17 :(得分:0)

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

bundle install --no-deployment

答案 18 :(得分:0)

我在不同的资源上阅读了十几种解决方案,但没有找到在这种情况下可以帮助我的确切信息

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

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