私はRails _rake db:migrate
_のようなrakeコマンドのみを使用して学習しました;しかし、単なるrake
の代わりに_bundle exec rake ...
_を使用する必要があることを読みました。今私は混乱しています。使用するものについて。
単純なrake
の代わりに_bundle exec 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 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
で。
bundle exec
なしで実行可能ファイルを実行すると、システムにインストールされたgemの最新バージョンをRubygemsが取得します。
代わりにbundle exec
プレフィックスを追加すると、Gemfile.lockのコンテキストで実行可能ファイルが実行されます。つまり、gemファイルで定義されたバージョンを使用して実行されます。