2011-07-05 1 views
299

bundle exec rake db:migrateの意味は?あるいは、一般的にはbundle exec rake <command>ですか?バンドルのexec rakeは何を意味していますか?

私はbundleがGemfile内のものを管理することを理解します。私は「exec」という言葉が何であるかを知っています。私はrakeがあなたがすることができる異なった叙述的なことをすべて維持していることを理解しています、そして、私はdb:migrateがそれらの一つであることを知っています。私はこれらの言葉が一緒に何をしているのか分かりません。 bundleを使用してrakeを実行してデータベースの移行を実行するのはなぜですか?

答えて

406

bundle execは、現在のバンドル(ディレクトリのGemfileのもの)のコンテキストでスクリプトを実行するためのコマンドであるBundlerです。 rake db:migrateは、のデータベースがネームスペースで、のマイグレーションが定義されているスクリプトです。

したがってbundle exec rake db:migrateは、現在のバンドルのコンテキストでコマンドdb:migrateを使用してrakeスクリプトを実行します。

「なぜですか?」私はbundler pageから引用されます:

いくつかのケースでは、bundle execなしの実行可能ファイルが動作して実行し、実行ファイルがシステムにインストールされるようなことが起こると、そのバンドルと競合任意の宝石に引っ張られていない場合。

しかし、これは信頼性が低く、かなりの痛みの原因です。それが動作するように見えても、将来、または別のマシンで動作しない可能性があります。

+3

ありがとう、非常に教育的です。 – JnBrymn

+0

バンドルのexecの意味ありがとう。 – rmagnum2002

+7

これは、常にbundle execを実行する必要があることを意味します。私はRubyとRubyをレールにインストールするためにRubyバージョンマネージャを使用しました。 –

0

これは、bundlerがdb:migrateタスクを認識して実行していないレーキに対して、バンドルが認識しているGemfileの一部であることを意味します。

1

私はbundle execをあまり使用していませんが、今設定しています。

間違ったレーキが使用されていて、問題の追跡に多くの時間を浪費していたことがありました。これはあなたがそれを避けるのに役立ちます。ここで

を使用すると、特定のプロジェクトのディレクトリにデフォルトでバンドルexecを使用できるようにRVMを設定する方法は次のとおりです。

http://robots.thoughtbot.com/post/15346721484/use-bundlers-binstubs

125

あなたがプログラムにbundle execを実行しています。プログラムの作成者は、特定のバージョンのgemが利用可能になったときにそれを書きました。プログラムGemfileは、作成者が使用することを決めた宝石のバージョンを指定します。つまり、スクリプトはこれらのgemバージョンに対して正しく実行されました。

システム全体のGemfileがこのGemfileと異なる場合があります。あなたは、このスクリプトがうまくいきません新しいまたは古い宝石を持っている可能性があります。このバージョンの違いは、あなたに奇妙なエラーを与える可能性があります。

Bundle execこれらのエラーを回避するのに役立ちます。システム全体のGemfileではなく、スクリプトのGemfileで指定されたgemを使用してスクリプトを実行します。シェルエイリアスの魔法を使って特定のgemバージョンを実行します。

the man pageをさらに参照してください。

は、ここで例Gemfileです:ここでは

source 'http://rubygems.org' 

gem 'rails', '2.8.3' 

bundle execはレールのバージョン2.8.3を使用してスクリプトを実行してしまうではないあなたは、システム全体のインストールされている可能性のある他のバージョン。

+9

私はOP:Dによって選ばれたよりもこの答えが好きです!はるかに明確です。 – lemavri

+1

この例に追加するには、人が単に 'rake db:migrate'を実行して' bundle exec'を省いた場合、システム全体のGemfileを使って1.5.2(最新)のラックを実行するでしょうか? –

+0

最も簡単でわかりやすい説明。 – JVK

6

bundle execを省略する方法があります(すべてMichael Hartls Ruby on Rails Tutorialの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ファイルに追加する必要があります。

番目のオプションを使用すると、RVMを使用していない場合はrubygems-bundler宝石を使用することです:

$ gem install rubygems-bundler 
$ gem regenerate_binstubs 
7

あなたgemfile.lockがマシンにインストールされている宝石の異なるバージョンを持っているとき、これは多くのことをアップします。バージョンに関係なく差のこのコマンドを実行するには、バンドラを告げる前に付けるbundle exec

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.

:あなたのようなレーキ(またはRSpecの等)を実行した後に警告が表示されることがあります。常に問題はないが、問題が発生する可能性があります。

幸いにも、これを解決する宝石があります:rubygems-bundler。

$ $ gem regenerate_binstubs

$ gem install rubygems-bundler

は、その後、再び、あなたの熊手、RSpecの、または何をしてみてください。

+0

Excelent!解決済み – mariowise

関連する問題