bundle exec rakeを使用しますか、それとも単にrakeを使用しますか?


84

rake db:migrate;のようなrakeコマンドだけを使用してRailsを学びました。しかし、私bundle exec rake ...は単なるプレーンの代わりに使用する必要があることを読みましたrake。今、私はどちらを使用するかについて混乱しています。

bundle exec rake単なるプレーンでrakeはなく使用する必要がありますか、それとも単なる好みのものですか?どんな洞察も大歓迎です!ありがとう!

回答:


129

bundle exec バンドルのコンテキストでコマンドを実行します。

つまり、Gemfileで指定されたgemを使用します。多くのbundle exec rake foo場合、実行すると、実行したときと同じ結果が得られますrake foo。特に、Gemfileと同じgemがシステム全体にインストールされている場合はそうです。ただし、一部のアプリケーションでは、システム全体にインストールしたものとは異なるバージョンのgemを指定し、それらの正確なgemとバージョンを正しく実行できるようにしたい場合があります。なしbundle execで実行すると、奇妙なエラーが発生する可能性があります。

を使用bundle execすると、gemfileで指定された環境でプログラムが実行されることが保証されます。これは、プログラムの作成者がプログラムの実行を希望する環境であることを意味します。つまり、どのような奇妙な設定でも正しく実行されるはずです。あなたのコンピュータ。

基本的に、プログラムが実行される環境を標準化します。これはバージョン地獄を回避するのに役立ち、生活をはるかに楽にします。

詳細については、http://bundler.io/v1.3/man/bundle-exec.1.htmlを参照してください。


4
いつもbundleexecと入力するのに飽きたら、rvmを設定して、必要がないようにすることができます:ruby.railstutorial.org/chapters/…–
Lance Fisher

1
注:バンドルのマニュアルページが変更されました。この日付の時点で正しいのは次のとおり
Americo Savinon 2013

1
使用することの良い副作用bundle execbundle install、Gemfile.lockファイルと比較して欠落しているgemのバージョンをインストールするために実行する必要があるかどうかも通知することです。
ジェイミッチェル

あなたはそれを非常によく説明しました..ありがとう。
Arup Rakshit 2015

5

$ bundle exec rake db:migrate
Gemfileで指定されたバージョンのrakeを使用して、rakeタスクを実行しますdb:migrate

しかし、Gemfileにはレーキジェムが指定されていません!
はい。ただし、他のgemの依存関係としてrakegemがインストールされています。Gemfile.lockを参照してください。したがって、ルールは次のようになります。Gemfile.lockで指定されたバージョンのrakeを使用します。

ただし、Gemfile.lockは特定のバージョンを指定していません。つまり、xyより大きいバージョンを指定しています。
その場合、ルールは次のようになります。現在のgemsetにインストールされているバージョンのrakeを使用します。

$ rake db:migrate
通常、コマンドラインでコマンド(たとえばrake)を発行すると、システムはPATH環境変数で指定されたディレクトリのリストでコマンドを検索します。コマンドを含む最初のディレクトリは、使用されるコマンドのバージョンです。つまり、どのディレクトリであるかを確認するには、次の操作を実行できます。

$ which rake

したがって、実行すると、

$ rake db:migrate

でインストールしたものとは異なるrakegemを使用する場合がありますbundle install。ただし、システムがと同じrakeバージョンを検出した場合でもbundle exec、rakeソースコードに必要なgemは、プロジェクトのgemset以外の場所で検索されます。したがって、次のような多くの方法があります。

$ rake db:migrate

物事を台無しにすることができます。

Ruby on Railsチュートリアルブック(無料オンライン)のセクション3.6によると、rvm 1.11.x +を使用している場合は、コマンドの前にbundle exec。を付ける必要はありません。


1

実行可能なものを実行せずに実行すると、Rubygemsbundle execはシステムにインストールされているgemの最新バージョンをフェッチします。

bundle exec代わりにプレフィックスを追加すると、実行可能ファイルがGemfile.lockのコンテキストで実行されます。つまり、gemファイルで定義されているバージョンを使用して実行されます。

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