Xは既に有効になっていますが、GemfileにはYが必要です


128

実行するrakeと、次のエラーが発生します。

rake 0.9.2はすでに有効化されていますが、Gemfileにはrake 0.8.7が必要です。bundle execの使用を検討してください。

bundle exec rake代わりにを使用するとrakeうまくいくようですが、これを修正するための最良の方法ですか?


これは、RVMを優れたツールにする理由でもあります。これにより、これらのプロジェクトごとに個別のgemのセットを用意できるため、これが再び発生することを心配する必要がなくなります。
rm-rf

回答:


84

これを行うにbundle exec 、使用正しい方法です。

基本的に何が起こっているのかというと、rakeを0.9.2に更新したため、Gemfileで指定されたバージョンと競合することになります。以前は最新バージョンがrakeGemfileのバージョンと一致していたため、単にを使用しても警告は表示されませんでしたrake

Yehuda Katz(元のBundler開発者の1人)は、このブログ記事ですべてを説明しています。

bundle exec ...いつもタイプしなくても済むように、Bundlerで一般的に使用するコマンドのエイリアスまたは関数をシェルに設定できます。たとえば、これは私がレイクに使用するものです:

$ type bake
bake is a function
bake () 
{ 
    bundle exec rake "$@"
}

5
ブログの投稿はあまり説明していません。本当の質問は:なぜ処女のルビーは正しい依存関係を取得しないのかそしてなぜ間違ったものを持っていると不平を言うのか?
Otheus

64

現在のバージョンのrake(または他のgemが問題を引き起こしているもの)を保持する理由がある場合mattは正しく、これを実行する最善の方法はを実行することbundle execです。これは、インストールした最新バージョンのGemではなく、Gemfileで指定されたバージョンを使用します。(rakeを実行するたびに入力したくない場合は、nathan.f77に以下の良い解決策がありますbundle exec

そうでなければ、rakeを更新しない理由がない場合は、

bundle update rake

これにより、bundle exec毎回実行する必要がなく、実際にはGemfile.lockが更新され、最新バージョンのrakeが使用されます。

注:bundle updateこれだけを実行すると、rakeだけでなくGemfile内のすべてのgemが更新されます。これはおそらく望んでいることではありません。アプリケーションで何かが壊れた場合、どのgem更新が原因であるかわからないためです。


使用せずに古いバージョンを保持するためのあまり推奨されない方法bundle execは、rakeの新しいバージョンをアンインストールすることです。

$ gemアンインストールレーキ

アンインストールするgemを選択:
 1. rake-0.8.7
 2. rake-0.9.2
 3.すべてのバージョン
> 2
rake-0.9.2が正常にアンインストールされました

これは機能しますが、異なるバージョンのrakeを使用する複数のアプリを使用している場合、異なるバージョンを常にインストールおよびアンインストールする必要があるため、これは面倒な場合があります。


これでうまくいきました。何らかの理由で、1つのバージョン(0.8.7)しかインストールされていませんでした。だから最初にやったgem install rake。次にgem uninstall rake、0.9.2を選択しました。
Bセブン

7
bundle updateまた、バージョンが指定されていないすべてのgemを利用可能な最新バージョンに更新します。それはあなたが望むものではないかもしれません。bundle update rakeより正確になります。
Alex Neth、2011

public_suffix代わりに同じ問題がありrakeます。bundle update public_suffix残念ながら、実行しても効果はありません。
Dmitri Zaitsev


13

これが最後に起こったとき、私はすべての宝石を更新していました。私はそうしました、gem uninstall rakeそしてそれはバージョンオプションをリストしました。新しいものを選んだので、bundle execもう使う必要はありませんでした。

基本的に、それを使用するbundle exec場合は、バンドルによってインストールされているgemのバージョンを使用するため、Gemfileの内容が使用されます。これがないbundle execと、システムのデフォルトのバージョンが使用されます。


8

おお!カッツの記事は素晴らしいです!

私はこのソリューションが一番好きです:

bundle install --binstubs

入力できるように

bin/rake .stuff.

2.3と3.0.9の両方のアプリを開発している私のような人にとって、これは私をとても良く感じさせます。


8

bundle exec 正しいですが、毎回入力する必要はありません。

これを.bashrcに入れることができます:

# Automatically invoke bundler for rake, if necessary.
rake() { if [ -e ./Gemfile.lock ]; then bundle exec rake "$@"; else /usr/bin/env rake "$@"; fi; }

明確にするために、.bashrcファイルはおそらくホームディレクトリ[〜/ .bashrc]にあります。このファイルは、新しいターミナルウィンドウを開くたびに読み込まれます。
ライアン

0

毎回入力しない別の方法は、Makefileを使用することです。たとえば、

rake :
    bundle exec rake
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.