Herokuにいくつかの変更をプッシュすると、_vendor/bundle
_に関する警告に気付きました(下記の[〜#〜] warning [〜#〜]を参照) 。
警告に従って、Gitトラッキングから「削除」する必要がある場合、このディレクトリの目的は何ですか?
Railsでデフォルトで_vendor/bundle
_が自動的に_.gitignore
_にならないのはなぜですか?
_bundle pack
_を実行する必要がありますか? (実際に_bundle package
_ですか??)
_bundle pack
_の長所と短所は何ですか(development
とproduction
の両方に対して)?
これをさらに混乱させるために、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)
...
_
プロジェクトに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
を意味すると思います。