29

Herokuにいくつかの変更をプッシュすると、に関する警告に気付きましたvendor/bundle(以下の警告を参照)。

警告に従って、Gitトラッキングから「削除」する必要がある場合、このディレクトリの目的は何ですか?

Railsがデフォルトでvendor/bundle自動的に'dしないのはなぜですか?.gitignore

実行する必要がありますbundle packか?(実際bundle packageですか??)

(との両方とbundle pack比較して)周りの長所と短所は何ですか?developmentproduction

これをさらに混乱させるために、RyanMcGearyによる「VendorEverything」というタイトルの人気のあるブログ投稿があります。私の他の懸念に関連してこれに光を当てることは大いにありがたいです。bundle install --path vendorecho 'vendor/ruby' >> .gitignorevendor/cachebundle package

ありがとうございました。

-bash> git push production master
...

-----> Heroku receiving push
-----> Ruby/Rails app detected
-----> WARNING:  Removing `vendor/bundle`.
       Checking in `vendor/bundle` is not supported. Please remove this directory
       and add it to your .gitignore. To vendor your gems with Bundler, use
       `bundle pack` instead.
-----> Installing dependencies using Bundler version 1.2.1
       Running: bundle install --without development:test --path vendor/bundle --binstubs bin/ --deployment
       Using rake (0.9.2.2)
       Using i18n (0.6.0)
       ...
4

1 に答える 1

90

プロジェクトにディレクトリがある場合は、vendor/bundleある時点で、引数を指定してコマンドを実行する必要がありbundle--path vendor/bundleます。これにより、すべてのプロジェクトのgem(にリストされているGemfile)のファイルvendor/bundleが、システムgemの場所ではなく、ローカルプロジェクトのディレクトリにロードされます。これを行うと、プロジェクトの宝石を他のプロジェクトから完全に分離できます。

Bundlerはすべての依存関係を解決するのが得意なので、使用する必要はありませんが--path、gemをプロジェクトごとに分離して整理したいので、使用することを選択する人もいます。また、ローカルマシンのバンドラーは、Herokuがバンドラーを使用するのと同じ方法で設定されていることを意味します。

このオプションを使用すると、コマンドrubygemsを実行するたびにサーバーからすべてのgemをダウンロードしますbundle

bundle packageさらに一歩進んで、実際に元のgemファイルをからダウンロードrubygemsし、ディレクトリにキャッシュしますvendor/cacherubygemsこれは、パッケージ化されたファイルをソースとして使用するため、bundleコマンドを実行するための接続が不要になったことを意味します。gemバージョンを更新する必要がある場合はrubygems、最初に要求されたときにに接続して新しいバージョンを収集する必要があります。もちろん、使用bundle packageには追加のディスクスペースが必要ですが、状況によっては問題になる場合と問題にならない場合があります。また、Herokuにプッシュするたびに、デプロイ時間と帯域幅の要件が増加します。

Herokuは、アプリケーションが機能するために必要なgemを読み取り、インストールするbundleたびにコマンドを実行します。デフォルトでは、このオプションが使用されます。これは、各アプリケーションがHeroku上の他のすべてのアプリとは別のgemファイルのセットを持つようにするためです。ソース管理にディレクトリがあり、それをHerokuにプッシュすると、既存のディレクトリにgemをロードしようとするため、重大な競合が発生する可能性があることがわかります。プッシュされると、Herokuは実行前にディレクトリを削除して、これらの潜在的な競合を削除します。この場合、バージョン管理下に置くことでデプロイ時間と帯域幅を浪費することになります。これをに追加することをお勧めします。git pushGemfile.lock--path vendor/bundlevendor/bundlevendor/bundlevendor/bundlebundle installvendor/bundle.gitignore

Herokuでgemを完全に制御したい場合は、bundle packageコマンドを使用して、vendor/cacheディレクトリがソース管理下にあることを確認してください。Herokuを実行bundle installすると、を使用するのではなく、のコンテンツをvendor/cachegemソースとして使用しrubygemsます。これが役立つかどうかは、個人的な好み、構築しているアプリの種類、宝石を更新する頻度の問題になります。bundle packageRyan McGearyの投稿は、将来のある時点で古い宝石が利用できなくなった場合に使用が役立つことを示唆しています。これは、定期的に最新の状態に保たれていないプロジェクト/アプリにとっては大きな問題のように思われます。

私の観点からは、私は通常--path vendor/bundle、ローカル設定をHerokuの設定にできるだけ近づけるために使用します。vendor/bundleプロジェクトは比較的定期的に更新されるため、プロジェクトのファイルに入れましたが、 gemはパッケージ化.gitignoreしません。

Railsの.gitignoreファイルは非常に限られています。必要なものを自分で構築することが効果的に期待されているためvendor/bundle、デフォルトでは含まれていません。

Herokuとは、という意味だと思いbundle packageますbundle pack

于 2012-09-26T12:40:42.230 に答える