Bundler:Gemfileを変更した後、デプロイメントモードでインストールしようとしています


86

私はbundleとcapistranoにかなり慣れていないので、それらを一緒に使用しようとしています。デプロイしようとすると、次のメッセージが表示されます。

Gemfileを変更した後、デプロイメントモードでインストールしようとしています。他の場所で「bundleinstall」を実行し、更新されたGemfile.lockをバージョン管理に追加します。

苦情を言っているシステムを満足させる方法がわかりません。また、ドキュメントを読んだため、苦情が発生する理由がわかりません。

Gemfile.lockが存在し、Gemfile(5)を更新した場合、bundleは、更新しなかったすべてのgemに対して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

回答:


80

発生しているエラーメッセージはGemfile.lockGemfileGemfile.lockが互いに同意していないことが原因である可能性があります。最後に実行してからbundle install(またはupdate)、Gemfileで何かを変更したようです。するとbundle install、Gemfileに加えた変更でGemfile.lockが更新されます。

bundle installローカルで実行していることを確認し、Gemfile.lockその後、新しく更新されたソース管理にチェックインしてください。次に、デプロイしてみます。

編集:コメントで認識されているように、Gemfileの条件により、あるプラットフォームでは有効なGemfile.lockが生成され、別のプラットフォームでは無効になりました。提供:プラットフォームGemfileでこれらのプラットフォームに依存宝石のためのフラグが非対称性を解決する必要があります。


2
正解のように聞こえますが、開発マシンでbundle installを実行し、Gemfileとそのロックをsvnにチェックインしてから、capistranoを使用しました。問題は、Gemfileに次のブロックが含まれていることが原因である可能性がありunless RbConfig::CONFIG['host_os'] === 'mingw32'ます。(Ergoは、Linuxサーバーとは異なるアイテムをWindowsコンピューターにバンドルする必要があります。)
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 / config

BUNDLE_FROZENオプションを「1」から「0」に変更します

「バンドルインストール」を行う


または

「バンドル構成」を実行します

「凍結」値がtrueかどうかを確認し、falseに設定します

バンドル設定が凍結されましたfalse


これが私のためにそれをしたことです。興味深いことに、構成ファイル自体では、キーBUNDLE_FROZENがまったく設定されていませんでした。他の場所でBUNDLE_FROZEN:1を設定した可能性はありますか?
Bo G.

bundle config frozen false私のgoto修正です。どうもありがとう、2年!Joshua Pinterの回答は、上記のコメントに対応していると思います。これに影響を与えるのは、グローバルなBundler構成である可能性があります。
SRack 2017

bundle config frozen false私には何もしませんでした。エントリBUNDLE_FROZEN = "true"(テキストtrue)
Arthur

19

グローバルなBundler構成に注意してください。

開発環境にグローバル構成~/.bundle/configがあり、CI /本番環境にグローバル構成がなかったため、開発環境でGemfile.lock生成されたものがCI /本番環境のものと異なっていました。

私の場合github.https、開発環境ではtrueに設定していましたが、CI /本番環境ではそのような構成はありませんでした。これにより、2つのGemfile.lockファイルが異なります。


2
ありがとう!このばかげたエラーに関連して飛び交うすべての簡単な答えの中で---これが私を仕事に戻した理由です。なぜHerokuはこれを自動アシストしないのですか?私の人生の最後の3時間を失ったなんてつまらない理由です!
hellion 2016

2
あなたは私の命を救ったかもしれません。私はこれについて自分自身を撃つ準備をしていました:P
Tyrone Wilson

1
@JoshuaPinter、はい、これは私を救いました!それに数時間を費やしましたが...しかし、私は「バンドルインストール」を行っているときに表示された警告を修正しようとしていて、このピクルスで立ち往生しました。大変感謝いたします!
daveomcd 2017

1
@daveomcdそこに行って、頭をかいてさらに数時間節約できてよかったです。:)
Joshua Pinter 2017

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

...次に、問題は、ベンダー/キャッシュディレクトリに古い.gemファイルがある可能性が高いです。

おそらく、以前に実行し$bundle install --deploymentて、「古い」.gemファイルをキャッシュに入れましたか?

いずれの場合も、次のコマンドを実行することで、このエラーを回避できます。 bundle install --no-deployment

これは、Railsの多くの優れた点の1つです...エラーメッセージは、問題を解決するために何をすべきかを正確に示していることがよくあります。


7

私の特定の問題は、@ JoshPinterによって報告されたもの、つまり、バンドラーがgithubからgemを取得するために使用するプロトコルのdev-vs-deployホストの不一致に関連していました。

簡単に言うと、次のGemfileエントリを変更するだけでした...

gem 'activeadmin', github: 'activeadmin'

...この安全な構文へ(リファレンスを参照):

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

そして、私の展開は通常に戻っています。


これで私も問題が解決しました。本当に奇妙です。
JoshuaMuheim19年

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 bundlerたり、with <role> gem update bundlerまたはon <machine> gem update bundler
Eric



1

私は以前に似たようなものに出くわしました。これを修正する1つの方法は、サーバー上で必要以上のスペースが必要になる可能性があると思いますが、実行することです。

bundle install --deployment 

次に、展開してみます。これは、すべてのgemをベンダーフォルダーにインストールするようなものです。これは一般的に避けるのが良いと思います...しかし、おそらくそれでも機能します。私のアプリは以前はこのように動作していました。私のソリューションは、ダウンロードする正確なバージョンを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はgemrails_12factorを追加しました。追加する前に使用していた場合は、次の2つの宝石があります。

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

新しいものを追加するときは、それらを削除する必要があります。(それらは含まれています)。gemファイルの行に触れるまでは問題を回避できると思います。そうすると、Herokuは重複に気づき、上記のエラーで叫びます。

Rails4で頑張ってください。


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

いくつかのgemの更新後に、Nestaアプリをデプロイすることに遭遇しました。私にとってうまくいったのは、Gemfile.lock削除し、実行bundle installして再生成し、再度デプロイすることでした。


0

私は同様の問題に遭遇しましたが、私は両方bundle installをしましたbundle updateし、Herokuのは、まだ私のプッシュを拒否しました。

Gemfile.lockを削除してからbundle install再度実行することで、この問題を修正しました。次に、それを追加してコミットし、gitリポジトリにプッシュしました。その後、Herokuにプッシュするのに問題はありませんでした。


gemfileでgemバージョンを修正していない限り、これは危険です。gemを更新し、アプリを壊す可能性があります
Abram

0

herokuの場合、の構文を変更する必要はありませんGemfileBUNDLE_GITHUB__HTTPS環境変数として(二重アンダースコアに注意して)追加し、(セクションのタブのtrue下にあるherokuアプリのダッシュボードで)に設定するだけです。これにより、そのようなすべての要求に対してプロトコルがからに切り替わります。SettingsConfig Varsgit://https://


0

Herokuにプッシュしようとするとエラーメッセージが表示されました。次の解決策が修正されました。

  1. Gitプルオリジンマスター
  2. Gitステータス
  3. Gitコミット
  4. Gitプッシュオリジンマスター
  5. Gitプッシュherokuマスター

0

この問題は、古いバージョンのコードを指すサブモジュールに関連している可能性があります。私の場合、サブモジュールを更新することでこの問題を解決しました

サブモジュールがある場合は、以下を実行してみてください。

git submodule update --init

bundle install


0

このコマンドの後、通常のバンドルインストールを再度実行できます。

bundle install --no-deployment

0

さまざまなリソースで12のソリューションを読みましたが、この状況で何が役立つかを正確に見つけることができませんでした

だから私は解決策を見つけました。正確に言うと、エラーメッセージを注意深く読み、解決策がありました。他の場所でbundleinstallを実行します。「Elsewhere」は、アプリを開発したCloud9でした。だから私のステップ

  1. GemfileとGemfile.lockをサーバーからローカルマシンにコピーします。 rsyncコマンドを
  2. これらの2つのファイルを私のRoRプロジェクトに挿入します(私はCloud9を使用しました)
  3. Gemfileを開き、必要な変更を加えます。私の場合、gem'thin 'を追加しました
  4. ターミナルCDでCloud9のアプリにアクセスし、を実行しbundle installます。この場合、Gemfile.lockのバージョンが変更されます
  5. を使用してサーバーに新しいGemfileとGemfile.lockをコピーしますrsync
  6. アプリフォルダにcdして、もう一度bundle install --deployment --without development test DONEを実行します 。すべての人に幸運を祈ります!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.