bundle exec

現在のbundleのコンテキストで、スクリプトを実行します。

文法

bundle exec [--keep-file-descriptors] command

説明

このコマンドは、Rubyプログラムで必要とされるGemfile(5)内で指定されている全てのGemを利用可能にして、 そのコマンドを実行します。

基本的に、もしrspec spec/my_spec.rbのように何らかのコマンドを実行し、 Gemfile(5)内のGemを使用して、 bundle install(1)を通してインストールしたいのであれば、 bundle exec rspec spec/my_spec.rbとして実行するべきです。

bundle execは、シェルの$PATH上で利用可能な実行ファイルを必要としないことに注意して下さい。

オプション

--keep-file-descriptors
Ruby 2.0でのexecは、非標準のファイル記述子を破棄し始めました。 このフラグが渡された場合、execは1.9の新しいプロセスへの全てのファイル記述子渡しの挙動を復帰します。

bundle install -binstubs

もし、bundle install(1)内で--binstubsフラグを使用した場合、 Bundlerは自動的に、bundle内のGemから利用可能な全ての実行ファイルを含むディレクトリ(デフォルトはapp_root/bin)を作成します。

--binstubsの使用後のbin/rspec spec/my_spec.rbの実行は、
bundle exec rspec spec/my_spec.rbと同一の処理になります。

Rails4での--binstubsの取り扱いには注意が必要です。詳細については下記のリンク先を参照して下さい。

環境の変更

bundle execはシェル環境に対して多数の変更を行い、次に指定されたコマンドを全て実行します。

  • bundle exec($BUNDLE_BIN_PATHを使用して)によって実行された内部コマンドから、 bundleへシェル出力を行う事が可能かを確認します。
  • $PATH上のbundleのために、 実行ファイル(railsrspecrackup)を含むディレクトリを配置します。
  • Bundlerがそのサブシェル内から実行された場合、同じGemfile(BUNDLE_GEMFILEの設定によって)を使用することを確認します。
  • $RUBYOPT-rbundler/setupを追加し、 サブシェル内で実行されるRubyプログラムがbundle内のGemを参照出来ることを確認します。

また、Rubygemsも変更します。

  • Bundle内に無いGemの読み込みを禁止します。
  • もし、要件にマッチするGemがbundle内にあれば、そのGemメソッドをno-op(何も行わない処理)に変更し、 もし、それが無ければGem::LoadErrorを発生させます。
  • sourceインデックスはBundlerを使用する際は常に凍結されるため、 Gem.refreshをno-op(何も行わない処理)に定義し、 環境変数内へのシステム漏れからGemを保護します。(翻訳に自信なし)
  • bundle内でGemを使用するためにGem.bin_pathを上書きし、 システムの実行ファイルを機能させます。
  • bundle内の全てのGemを、Gem.loaded_specs内へ追加します。

シェル出力

サブシェル(system、バッククォート、%x{}等)を開くRubyのコードは、 自動的に現在のBundler環境を使用します。 もし、あなたのbundleの一部では無いRubyコマンドへのシェル出力が必要な場合、 ブロックとwith_clean_envを使用して下さい。 ブロック内部で作成されたサブシェルは、Bunlderが有効になる前の環境が与えられます。 例えば、HomebrewコマンドはRubyを実行しますが、bundle内部では動作しません。

Bundler.with_clean_env do
  `brew install wget`
end

異なるbundleへシェル出力を行う場合にも、 with_clean_envの使用が必要になります。 サブシェル内の一部のBundlerコマンドは、現在のGemfileを継承するため、 異なるbundleのコンテキストでの実行が必要なコマンドも、with_clean_envが必要になります。

Bundler.with_clean_env do
  Dir.chdir "/other/bundler/project" do
    `bundle exec ./script`
  end
end

Bundlerはsystemexecでラップする便利なヘルパーを提供し、 これらは次のようにして使用することが出来ます。

Bundler.clean_system('brew install wget')
Bundler.clean_exec('brew install wget')

RubyGemsプラグイン

現在、Rubygemsプラグインのシステムでは、あるRubyコードがrubygems.rbを必要とする際に、 インストールされたGemの読み込みパス(load path)上のrubygems_plugin.rbという名前の全てのファイルを必要とします。 これはrailsrackuprspecのような、 システムへインストールされる実行ファイルを含みます。

Rubygemsプラグインは任意のRubyコードを含むため、 一般的にはそれらが自分自身とその依存性を有効にします。

例えば、gemcutter 0.5のGemはjson_pureに依存します。 もし、インストールされたgemcutter(この問題抜きに、新しいバージョンであるとしても)があれば、 Rubygemsはgemcutter 0.5json_pure <latest>を有効にします。

もし、Gemfile(5)にもjson_pureが含まれる(または、json_pureに依存するGemがある)場合、 あなたのシステムの最新のバージョンで、Gemfile(5)のバージョン、 またはGemfile.lock内のスナップショットのバージョンが衝突を起こすかもしれません。

もしこれが起こると、Bundlerは次のように報告してきます。

You have already activated json_pure 1.4.6 but your Gemfile
requires json_pure 1.4.3. Consider using bundle exec.

(既にjson_pure 1.4.6が有効にされていますが、Gemfileはjson_pure 1.4.3を必要としています。 bundle execの使用を検討してください。)

このような状況では、あなたはきっと問題を起こしているGemプラグインと一緒に、根本的な原因であるGemを削除したくなるでしょう。 通常、これらのプラグイン(この場合は、gemcutterのGem)の作者は、 より慎重な新しいバージョンをリリースしています。

次のように実行することで、Gemプラグインを含めた全てのGemのリストを確認することが出来ます。

ruby -rubygems -e "puts Gem.find_files('rubygems_plugin.rb')"

少なくとも、各Gemプラグインの最新のバージョンでは無いものを全てを削除し、 使用してしない全てのGemプラグインも削除するべきです。(gem uninstall gem_name)

 Back to top

© 2010 - 2017 STUDIO KINGDOM