回答:
bundle exec
あるバンドラーの現在のバンドル(ディレクトリの1からのコンテキストでスクリプトを実行するコマンドGemfile)。rake db:migrate
スクリプトで、DBは、名前空間では、と移行は、定義されたタスク名です。
したがって、現在のバンドルのコンテキストでbundle exec rake db:migrate
コマンドを使用db:migrate
してrakeスクリプトを実行します。
場合によっては、実行可能ファイルを
bundle exec
システムにインストールしていて、バンドルと競合するgemを取得しない場合、実行ファイルなしで実行すると機能することがあります。ただし、これは信頼性が低く、かなりの痛みの原因になります。動作しているように見えても、将来または別のマシンでは動作しない可能性があります。
bundle
バンドラーによって使用されるコマンドです。
.ruby-gemset
、プロジェクトルートにファイルがある場合にのみ当てはまります。.ruby-version
RVMを使用している場合、Rubyのバージョンを設定するファイルもあります。
bundle exec
プログラムで実行しています。プログラムの作成者は、特定のバージョンの宝石が入手可能になったときにそれを作成しました。プログラムGemfileは、作成者が使用することを決定したgemのバージョンを指定します。つまり、スクリプトはこれらのgemバージョンに対して正しく実行されるように作成されています。
システム全体のGemfileは、このGemfileと異なる場合があります。このスクリプトがうまく機能しない新しいまたは古い宝石があるかもしれません。このバージョンの違いにより、奇妙なエラーが発生する可能性があります。
bundle exec
これらのエラーを回避するのに役立ちます。システム全体のGemfileではなく、スクリプトのGemfileで指定されたgemを使用してスクリプトを実行します。シェルエイリアスの魔法で特定のgemバージョンを実行します。
詳細については、manページを参照してください。
これがGemfileの例です:
source 'http://rubygems.org'
gem 'rails', '2.8.3'
ここでbundle exec
は、システム全体にインストールした他のバージョンではなく、Railsバージョン2.8.3を使用してスクリプトを実行します。
rake db:migrate
外に出て走った場合、bundle exec
システム全体のGemfileを使用して実行されます(1.5.2(最新)のラックがある可能性があります)。
bundle exec
、アプリのGemfileで「アプリ固有」のローカルgemをbundle
使用し、実行しgem install a_certain_gem
た場合は「マシン固有」のグローバルgemを使用します。ローカルvsグローバル
これは、gemfile.lockにさまざまなバージョンのgemがマシンにインストールされている場合によく起こります。rake(またはrspecなど)を実行すると、次のような警告が表示される場合があります。
You have already activated rake 10.3.1, but your Gemfile requires rake 10.1.0. Prepending "bundle exec" to your command may solve this.
Prepending bundle exec
は、バージョンの違いに関係なく、このコマンドを実行するようにバンドラーに指示します。常に問題があるわけではありませんが、問題が発生する可能性があります。
幸いなことに、これを解決する宝石がrubygems-bundlerです。
$ gem install rubygems-bundler
$ $ gem regenerate_binstubs
次に、レーキ、rspec、またはその他を試します。
省略できる方法があることはおそらく言及する必要がありますbundle exec
(それらはすべて、Michael Hartls Ruby on Railsチュートリアルブックの3.6.1章に記載されています)。
最も単純なのは、十分に最新のバージョンのRVM(> = 1.11.x)を使用することです。
以前のバージョンのRVMに制限されている場合は、calasyrでも言及されているこの方法をいつでも使用できます。
$ rvm get head && rvm reload
$ chmod +x $rvm_path/hooks/after_cd_bundler
$ bundle install --binstubs=./bundler_stubs
次に、bundler_stubs
ディレクトリも.gitignore
ファイルに追加する必要があります。
3番目のオプションは、rubygems-bundler
RVMを使用していない場合はGem を使用することです。
$ gem install rubygems-bundler
$ gem regenerate_binstubs
rakeタスクを直接実行するか、gemのバイナリファイルを実行する場合、コマンドが期待どおりに動作する保証はありません。システムに同じgemがすでにインストールされており、バージョンが1.0であるのが原因である可能性がありますが、プロジェクトではより高いバージョンが2.0であると考えられます。この場合、どちらが使用されるかを予測することはできません。
目的のgemバージョンを強制bundle exec
するには、現在のバンドルのコンテキストでバイナリを実行するコマンドを使用します。つまり、bundle execを使用すると、bundleは現在のプロジェクト用に構成されたgemバージョンをチェックし、それを使用してタスクを実行します。
また、ビンスタブを使用してそれを使用しないようにする方法を示す、それに関する投稿も書きました。
bundle exec
あまり使用していませんが、今セットアップしています。
私は間違ったレーキが使用された例があり、問題を追跡するのに多くの時間が無駄になりました。これはそれを回避するのに役立ちます。
bundle exec
特定のプロジェクトディレクトリ内でデフォルトで使用できるようにRVMを設定する方法は次のとおりです。