2

Railsコマンドプロンプトでgem list rack-cacheを実行すると、その名前のgemは表示されませんが、 bundle show rack-cacheを実行すると、 /vendor/bundle/ruby/1.9.1/gems/rackのようなパスが表示されます-cache-1.2の gem が保存されている場所。

gem が後者のコマンドでパスに存在する場合、gem list rack-cache コマンドを実行しても表示されないため、この動作を理解できませんでした。違いは何ですか。

4

3 に答える 3

6

混乱は、バンドラーが解決している問題から来ています。

システム全体のgemリポジトリにGemsをインストールすると、いくつかのアプリを入手すると、gemの複数のバージョンが作成されます。

したがって、たとえば、3つのRailsバージョン(3.2.8、3.2.6、および3.1.0)になる可能性があります。

require railsRubygemsを実行すると、これらのバージョンのいずれかを使用でき、最初に3.1.0に対してビルドされたアプリが、3.2.8の一部の変更と互換性がない場合、混乱を招くことになります。

bundlerが行うことは、Gemfile.lockで指定されているgemを正確にインストールし、そのアプリを使用できるようにそれらをロックすることです。したがって、Bundlerはrubygemsのロードパスを変更して、Gemfile.lock内のGemsのみがアプリで実際に使用できるようにします。

したがってbundle install、gemをシステム全体のgemディレクトリにインストールするのではなく、プロジェクトごとに異なるパスにインストールします。これが、システム全体ではなく、バンドラーディレクトリにgemが表示される理由です。rack-cacheを介してインストールするgem installと、にも表示されgem listます。

于 2012-12-04T10:29:21.850 に答える
2

バンドルショー:

バンドルの一部であるすべての gem、または特定の gem へのパスを表示します

$ bundle show [GEM] [--paths]

Mac の開発モードでは、gem は引き続きデフォルトの gem パスにインストールされますが、プロダクション モードでは、プロジェクト固有のフォルダーにインストールされます。各マシンで bundle show rails を実行してみてください。

gem list を実行すると、メインの gem フォルダーが検索されます。本番の gem はプロジェクト固有のフォルダーにあるため、グローバル gem コマンドはそこを参照することを認識していません。そのため、これらのプロジェクト固有の gems コマンドをサーバー上で実行するには、bundle exec を実行する必要があります。私の目的のために、バンドル exec に be エイリアスを作成しました。また、プロジェクトの gem を一覧表示するには、 bundle list を実行できます。

この背後にある理論的根拠については、 http: //gembundler.com/rationale.html#deploying-your-applicationを参照してください。

于 2012-12-04T10:41:12.610 に答える
2

との間にはわずかな違いがbundle showあります。gem list

bundle showgem list現在のアプリケーションにインストールされているすべての gem を一覧表示します [Gemfile.lock ファイルで確認できます] gemset
bundle show gem_nameそれがある場所にパスを提供します。
gem list gem_nameローカルの gem または gemset にインストールされているすべてのバージョンで同じ gem_name を指定します。

于 2012-12-04T10:37:22.160 に答える