bundle exec rakeはどういう意味ですか?


350

どういうbundle exec rake db:migrate意味ですか?それともbundle exec rake <command>一般的に?

bundleGemfileのメンテナンスを行うことで理解します。「exec」という言葉の意味を知っています。rakeは、あなたが実行できるさまざまなスクリプトのすべてを維持していることを理解していますdb:migrate。それがその1つであることを知っています。これらすべての単語が一体何をしているのか、私にはわかりません。なぜデータベース移行のbundle実行rakeに使用する必要があるのですか?

回答:


468

bundle execあるバンドラーの現在のバンドル(ディレクトリの1からのコンテキストでスクリプトを実行するコマンドGemfile)。rake db:migrateスクリプトで、DBは、名前空間では、と移行は、定義されたタスク名です。

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

「なぜ?」について バンドルページから引用します

場合によっては、実行可能ファイルをbundle execシステムにインストールしていて、バンドルと競合するgemを取得しない場合、実行ファイルなしで実行すると機能することがあります。

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


7
つまり、常にbundle execを実行する必要があるということですか?rubyとrubyをRailsにインストールするには、Rubyバージョンマネージャを使用しました。
Pradeep Sharma

11
@Edmund「バンドル」は英語の単語であり、通常はきちんと結び付けられた類似のグループを意味します。特にこの質問では、Gems(自己完結型のRubyコードライブラリ)のグループを指します。Bundlerは、Gemsを管理するためにここで使用しているソフトウェアの名前です。そして、bundleバンドラーによって使用されるコマンドです。
ghoppe 2013年

2
Gemfileのあるフォルダーにcdを実行すると、シェルはGemfileで指定されたバージョン(Rubyバージョンなど)を自動的に使用するという印象を受けます。その仮定に基づいて、rake db:migrateはbundle execなしで常に正常に動作すると思いました。CMIIW
Pahlevi Fikri Auliya

1
@PahleviFikriAuliyaこれは.ruby-gemset、プロジェクトルートにファイルがある場合にのみ当てはまります。.ruby-versionRVMを使用している場合、Rubyのバージョンを設定するファイルもあります。
ナマズ

1
リンク先のページでは、指定した引用については言及されなくなりました。修正してください、ありがとう。
Gaurang Tandon

153

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を使用してスクリプトを実行します。


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

1
したがって、この例に追加すると、人が単にrake db:migrate外に出て走った場合、bundle execシステム全体のGemfileを使用して実行されます(1.5.2(最新)のラックがある可能性があります)。
Smokin Joe 14

具体的な例を挙げて、はるかに良い答え。
ahnbizcad 2015

2
したがってbundle exec、アプリのGemfileで「アプリ固有」のローカルgemをbundle使用し、実行しgem install a_certain_gemた場合は「マシン固有」のグローバルgemを使用します。ローカルvsグローバル
ahnbizcad 2015年

選ばれたものよりはるかに良い答え。
ブーン

9

これは、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、またはその他を試します。


それでも2020年における優れたソリューション
Brateq

6

省略できる方法があることはおそらく言及する必要があります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-bundlerRVMを使用していない場合はGem を使用することです。

$ gem install rubygems-bundler
$ gem regenerate_binstubs

1

rakeタスクを直接実行するか、gemのバイナリファイルを実行する場合、コマンドが期待どおりに動作する保証はありません。システムに同じgemがすでにインストールされており、バージョンが1.0であるのが原因である可能性がありますが、プロジェクトではより高いバージョンが2.0であると考えられます。この場合、どちらが使用されるかを予測することはできません。

目的のgemバージョンを強制bundle execするには、現在のバンドルのコンテキストでバイナリを実行するコマンドを使用します。つまり、bundle execを使用すると、bundleは現在のプロジェクト用に構成されたgemバージョンをチェックし、それを使用してタスクを実行します。

また、ビンスタブを使用してそれを使用しないようにする方法を示す、それに関する投稿も書きました。


1

bundle execあまり使用していませんが、今セットアップしています。

私は間違ったレーキが使用された例があり、問題を追跡するのに多くの時間が無駄になりました。これはそれを回避するのに役立ちます。

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

https://thoughtbot.com/blog/use-bundlers-binstubs


0

これは、バンドラーが認識せず、Gemfileの一部であるレーキを使用して、バンドラーが認識していないレーキよりもdb:migrateタスクを実行することを意味します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.