web-dev-qa-db-ja.com

ベンダー/バンドルの目的は何ですか? Herokuから削除するように指示された

Herokuにいくつかの変更をプッシュすると、_vendor/bundle_に関する警告に気付きました(下記の[〜#〜] warning [〜#〜]を参照) 。

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

Railsでデフォルトで_vendor/bundle_が自動的に_.gitignore_にならないのはなぜですか?

_bundle pack_を実行する必要がありますか? (実際に_bundle package_ですか??)

_bundle pack_の長所と短所は何ですか(developmentproductionの両方に対して)?

これをさらに混乱させるために、Ryan McGearyによる人気のブログ投稿 "Vendor Everything"がまだ適用されます は、_bundle install --path vendor_および_echo 'vendor/Ruby' >> .gitignore_の実行と宝石のパッケージングを強く主張しています_vendor/cache_を実行して_bundle 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)
       ...
_
25
user664833

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

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

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

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

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

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

私の見解では、私は通常、--path vendor/bundleを使用して、ローカルのセットアップをHerokuの可能な限り近くに保ちます。私のプロジェクトは比較的定期的に更新されるため、プロジェクトのvendor/bundleファイルに.gitignoreを入れましたが、gemはpackageしません。 。

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

Herokuがbundle packageと言うとき、bundle packを意味すると思います。

84
nmott