2011-11-26 9 views
69

rakeコマンド(rake db:migrateなど)を使ってRailsを学びました。しかし、私はbundle exec rake ...をただ普通のrakeの代わりに使うべきだと読んだ。今私は使い方について混乱しています。バンドルのexec rakeまたはrakeを使用しますか?

の代わりにbundle exec rakeを使用する必要がありますか、それとも単なる好みのものですか?どんな洞察も大いに評価されるだろう!ありがとう!

答えて

101

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

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

bundle execを使用すると、gemfileで指定された環境でプログラムが実行されることが保証されます。これは、プログラムの作成者が実行したい環境であることを意味します。あなたがあなたのコンピュータに持っている不思議な設定。

基本的に、プログラムの実行環境を標準化しています。これはバージョン地獄を避け、人生をはるかに簡単にします。

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

+4

バンドルexecを常に入力するのにうんざりする場合は、rvmを設定することができます。http://ruby.railstutorial.org/chapters/static-pages#sec:eliminating_bundle_exec –

+1

注:Bundleのマニュアルページ変更されました。この日付の正しい時刻は次のとおりです:http://bundler.io/v1.3/man/bundle-exec.1.html –

+1

'bundle exec'を使用することの良い副作用は、 'bundle install'を実行してgemfile.lockファイルと比較して紛失している宝石のバージョンをインストールする必要がある場合。 –

1

bundle execなしでアクセシビリティを実行すると、システムにインストールされている最新のバージョンのGemがフェッチされます。

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

4

$ execをすくいデシベルをバンドル:
を移行rakeタスクdb:migrateを実行するためにGemfileで指定されたレーキのバージョンを使用します。

ただし、Gemfileにはレーキの宝石はありません!
はい、しかし、レーキの宝石は、他の宝石の依存関係としてインストールされていました.Gemfile.lockにあります。ルールは次のようにする必要があります:Gemfile.lockで指定されたレーキのバージョンを使用します。

しかし、Gemfile.lockには特定のバージョンが指定されていません。これはx.y!より大きいバージョンを指定しています!
ルールは以下の通りでなければなりません:現在のジェムセットにインストールされているレーキのバージョンを使用します。

$すくいデシベル:例えば、コマンドラインでコマンドを発行
通常の、移行rakeでは、PATH環境変数で指定されたディレクトリのリスト内のコマンドが検索されます。コマンドを含む最初のディレクトリは、使用されているコマンドのバージョンです。あなたがbundle installでインストールとは別のすくい宝石を使用することが

$ rake db:migrate 

$ which rake 

をあなたが実行した場合:あなたが行うことができますこれは、ディレクトリ、参照してください。しかし、あなたのシステムがbundle execと同じレーキバージョンを見つけたとしても、レーキソースコードで必要とされる宝石は、プロジェクトのgemset外の場所で検索されます。したがって、多くの方法があるだけです。

$ rake db:migrate 

ねじを締めることがあります。

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

+0

良いこと、ありがとう –