2012-02-09 7 views
0

を持っている、エラーメッセージは、次のようになります。Gemfile.lockは、デプロイメント環境でのレーキの異なるバージョン要するに

$ bundle install 
rake aborted! 
You have already activated rake 0.9.2.2, but your Gemfile requires rake 0.9.2. Using bundle exec may solve this. 

そして、ここでは、このエラーの説明です:

  • 展開サーバーはrake 0.9.2.2を持っていますインストール済み
  • アプリケーションGemfileには、必要なバージョン番号がありませんrake
  • 開発者のd evelopment環境はrake 0.9.2がインストールされているし、展開サーバーは、レールのアプリケーションの数が
  • をインストールした
  • Gemfile.lockファイルで、このバージョン番号は、これらのアプリケーションを別のプログラマ
  • によって書かれているこれらのプログラマは自分の中に設置異なるすくいバージョンを持っています開発環境
  • それらのいくつかrake 0.9.2を持っており、他の人がYehuda Katz's Clarifying the Roles of the .gemspec and Gemfile読み取ることによりrake 0.9.2.2
  • を持って、Gemfile.lockファイルは、私たちのsubversionである

可能なソリューション:

  • エラーメッセージがbundle exec rake installを実行することで回避することができ、その後bundle update我々はGemfileで熊手の同じバージョンを指定するには、すべての開発者を依頼された場合
  • エラーメッセージを回避することができ
  • すべての開発者に同じバージョンのレーキを使用するように依頼する

私の質問です:これは正しい解決策ですか?それとも正しい解決策がありますか?

私はまだ実際にはGemfile.lockファイルが破壊されるべきではないと確信しています。

+0

Antherの可能なソリューションはRVMを使用しています:RVMでは、Rubyの特定のバージョンから、アプリケーションを実行するために必要な正確な宝石のセットまで、独自の完全な専用環境。 – peterpengnz

答えて

4

Gemfile.lockを必ずチェックインする必要があります。あなたのアプリケーションで動作することがわかっている宝石のバージョンが入っています。だからあなたが別の環境にインストールをバンドルするとき、それはうまくいくはずです。

今から2,3ヶ月後に、誰かがGemfile.lockを使わないでバンドルをインストールするとします。彼らはあなたのGemfile(少なくとも指定されたバージョンを持つもの)に最新のバージョンのgemを取得し、あなたのアプリがそれらのgemで動作するという保証はありません。 Gemfile.lockを使用すると、アプリを実行する必要があるという確信があります。なぜなら、それを使って作業したり、テストを実行した人は、それらのフリーズされた宝石のバージョンでは合格状態になっているはずです。

あなたの問題を解決するために、私はどうなる:

bundle update rake 

をして、GemfileとGemfile.lockをコミットします。この方法で、0.9.2.2のレーキを使用しているはずのアプリを実行しているすべての人に知らせることになります。これはあなたのアプリで動作することがわかっているレーキのバージョンで、テストはこのバージョンに対して実行されます。

  • バンドル幹部:あなたの.bash_profile、.zshrc、または.profileにエイリアスを追加する

    $ bundle exec rake -T 
    

実際にはいくつかのオプションを持っている正しいバージョンを実行するには

も役立ちます:

# in .bash_profile 
alias b="bundle exec" 
$ b rake -T 
  • バンドルbinstubs

    # in your .bash_profile 
    export PATH="./.bin:$PATH" 
    $ bundle install --binstubs 
    

これは最初のRVMで検索する前に、ディレクトリとパスの変更が./binに確認するようにシェルを強制されます./binためにあなたのGemfileのバイナリをインストールするか、あなたの宝石をインストールしますバイナリ。これを行う場合は、.gitignoreファイルに 'bin'を追加することを忘れないでください。

  • rubygems-bundler gem。この宝石はあなたのためにバンドルexecをいつ使うべきかを決定しようとするラッパーを生成します。
+0

良い答え。しかし、私はこのための最善の解決策は、すべての開発者に同じバージョンのレーキを使用するよう求めていると思います。更新されたGemfileとGemfile.lockをバージョン管理に再コミットすることによって、1つのアプリケーションの問題のみが解決されました。実動サーバー上には、多くのアプリケーションがあります。何らかの理由で、ひとつのアプリケーションでRAKE 0.9.2.2が有効になった。 rake 0.9.2を使用する他のアプリケーションが再起動に失敗することがあります。ですから、何らかの形で、すべてのアプリケーションでレーキバージョンを同じに保つ必要があります。それは技術的な問題ではなく論理的な問題かもしれません。私は私の質問でRVMについて言及するのを忘れてしまった。 – peterpengnz

+0

続行... RVMは別の宝石セットを作成します。この問題の技術的解決策かもしれません。ありがとうございます – peterpengnz

1

生産rake(2番目と3番目のソリューション)の同じバージョンでみんなを維持しようと非常に高い可能性があり、すべての下流の競合の管理に経験するあなたのチームを排出。また、gem/script/module XYZを使用する必要がある場合には、開発者の不満のレベルが高まりますが、XYZとmandedバージョンのrakeに問題があります。

あなたの環境でbundleコマンドが効率的に実行されるように対策を講じる限り、ソリューション1はあなたのチームの生産性にはるかにマイナスの影響を与えます。私見では。

+0

それは本当です。それは簡単ではない。宝石の1つがレーキ0.9.2.2またはレーキ0.9.2のいずれかでのみ動作することを要求する場合、開発者は不満を感じるでしょう。そして、あなたは他の人の宝石をコントロールすることはできません。私は今私の結論を変えていると思います。これについての最も良い解決策は、すべての開発者に同じバージョンのレーキを使用するよう求めていることです。私はRVMが私のために問題を解決することを望んでいます。それは、各レールアプリケーション用に別々の宝石セットを作成するからです。 – peterpengnz

関連する問題