web-dev-qa-db-ja.com

すでにXをアクティブにしていますが、GemfileにはYが必要です

rakeを実行すると、次のエラーが表示されます。

すでにrake 0.9.2をアクティブにしていますが、Gemfileにはrake 0.8.7が必要です。 bundle execの使用を検討してください。

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

111
ming yeow

bundle execを使用するのはこれを行う正しい方法です。

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

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

bundle exec ...を常に入力しないようにするには、Bundlerでよく使用するコマンドのシェルにエイリアスまたは関数を設定できます。たとえば、これは私がRakeに使用しているものです:

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

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

それ以外の場合、rakeを更新しない理由がない場合は、実行できます

bundle update rake

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

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


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

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

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

59
Ryan

bundle clean --force

このバンドルにないすべてのシステムgemを削除します

23
Oleg Dikusar

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

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

13
paarshad

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; }
8
ndbroadbent

ああ! Katzの記事は素晴らしいです!

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

bundle install --binstubs

入力できるように

bin/rake .stuff.

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

7
nessur