web-dev-qa-db-ja.com

bundle exec rakeまたは単にrakeを使用しますか?

私はRails _rake db:migrate_のようなrakeコマンドのみを使用して学習しました;しかし、単なるrakeの代わりに_bundle exec rake ..._を使用する必要があることを読みました。今私は混乱しています。使用するものについて。

単純なrakeの代わりに_bundle exec rake_を使用する必要がありますか、それとも単に好みのものですか?どんな洞察も大歓迎です!ありがとう!

76
agentbanks217

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 を参照してください。

119
jergason

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

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

しかし、Gemfile.lockは特定のバージョンを指定しません-x.y!よりも大きいバージョンを指定します!
次に、ルールは次のようにする必要があります。現在のgemsetにインストールされたバージョンのrakeを使用します。

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

$ which rake

実行すると、

$ rake db:migrate

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

$ rake db:migrate

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

Ruby on Rails Tutorial Book(無料オンライン)、セクション3.6、rvm 1.11.x +を使用している場合、コマンドを序文する必要はありません。 bundle execで。

5
7stud

bundle execなしで実行可能ファイルを実行すると、システムにインストールされたgemの最新バージョンをRubygemsが取得します。

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

1
pastullo