rake db:migrate
;のようなrakeコマンドだけを使用してRailsを学びました。しかし、私bundle exec rake ...
は単なるプレーンの代わりに使用する必要があることを読みましたrake
。今、私はどちらを使用するかについて混乱しています。
bundle exec rake
単なるプレーンでrake
はなく使用する必要がありますか、それとも単なる好みのものですか?どんな洞察も大歓迎です!ありがとう!
rake db:migrate
;のようなrakeコマンドだけを使用してRailsを学びました。しかし、私bundle exec rake ...
は単なるプレーンの代わりに使用する必要があることを読みましたrake
。今、私はどちらを使用するかについて混乱しています。
bundle exec rake
単なるプレーンでrake
はなく使用する必要がありますか、それとも単なる好みのものですか?どんな洞察も大歓迎です!ありがとう!
回答:
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を参照してください。
bundle exec
はbundle install
、Gemfile.lockファイルと比較して欠落しているgemのバージョンをインストールするために実行する必要があるかどうかも通知することです。
$ 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
。を付ける必要はありません。