18

これらはまったく同じことを達成しますか?

  • でルビープロセスを開始するbundle exec ruby foo.rb
  • require "bundler/setup"の最初の行として持つfoo.rb
4

1 に答える 1

25

あなたの特定の例では、それらは同じと見なすことができますが、実際には同じではありません。

bundle execbundler/setup行わない環境にいくつかの変更を加えます。サブシェルを実行したことがない場合foo.rb、またはサブシェルで他の Ruby 実行可能ファイルを実行しようとしたことがない場合、両方のバージョンは同等です (どちらもバンドルされた gem を正しくロードし、まったく同じように動作します)。

の全体的なアイデアは、もともとバンドラーを念頭に置いて設計されていない実行可能ファイルを実行bundle execできるようにすることです。、、のように。独自のアプリ ( ) がバンドルに依存している可能性のある実行可能ファイルを実行しようとしない場合、どちらの方法でも違いはありません。バンドラーで確認したいのは、正しいgemをロードすることだけなので、その場合は期待どおりに機能します。rspecrailsrackupfoo.rbbundler/setup

ruby システムの実行可能ファイルの実行について話しているときのバンドラーのドキュメントから:

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

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

次に、bundle exec のマンページbundle execから、実際に何が行われるかに関する追加の手がかりを得ることができます。

環境の変更

  • bundle exec ($BUNDLE_BIN_PATH を使用) によって呼び出されたコマンド内からバンドルにシェルアウトできることを確認します。
  • バンドルの実行可能ファイル (rails、rspec、rackup など) を含むディレクトリを $PATH に配置します。
  • バンドラーがサブシェルで呼び出される場合、同じ Gemfile を使用することを確認してください (BUNDLE_GEMFILE を設定することにより)。
  • -rbundler/setup を $RUBYOPT に追加します。これにより、サブシェルで呼び出された Ruby プログラムがバンドル内の gem を確実に認識できるようになります。

したがって、バンドラーのサポートを念頭に置いてアプリを構築する場合、アプリを作成する必要はありませんbundle exec

ただし、アプリ コードをロードする前に gem をロードする可能性のあるアプリ コードをロードする他のツールを使用する必要がある場合(バンドルされていない間違った gem をプルする可能性があります)、 を使用する必要があります。bundle exec

于 2012-06-20T11:04:36.700 に答える