これが私たちの状況です:
3つの異なるLaravelプロジェクトがあり、3つのプロジェクトすべてがコアプロジェクトに依存しています。このコアプロジェクトは、プライベートリポジトリでホストされる個別のLaravelパッケージであり、使用されます他のプロジェクトの依存関係として。
以前は、コアプロジェクトで何かが変更されるたびに、composer各プロジェクトのサーバーでourvendor/ourcorepackageを更新して、コアの変更をプルします。ただし、最近はcomposer 512 MBのRAMを搭載したDigitalOceanステージング環境で更新を実行しようとすると、深刻なメモリの問題が発生するようです。参照: https://github.com/composer/composer/issues/1898
私がいつも出くわす解決策は、常にcomposer installを本番サーバーにインストールする必要がある」という人たちです。新しいサーバーに更新すると危険な場合があるため、セキュリティの観点からこれに関連することができます。コードを壊す可能性のあるサードパーティパッケージのバージョン。ただし、この場合は独自のコアパッケージのみを更新するため、何をしているのかがわかりますが、このメモリの問題により、composer =メモリをあまり必要としないため、インストール方法。
つまり、基本的にこれが現在のワークフローです。
コアパッケージで何かが変更された場合、composer各プロジェクトでourvendor/ourpackageをローカルに更新する必要があります。これによりcomposer.lockファイルが生成されます。
リポジトリにcomposer.lockファイルをコミットします
各プロジェクトのサーバーで、gitpullを実行してcomposer installを実行します。これにより、コアパッケージが更新されるだけで、実行速度が大幅に向上し、メモリの問題は発生しませんvs composer更新
ただし、このソリューションでは2つの問題が発生します。
だから私はここで何をすべきですか?サーバーをプルする前に、composer.lockファイルを削除しますか? composer.lockファイルのマージの競合をどのように処理する必要がありますか?
composer updateは、その方法がはるかに論理的であるように見えるため、メモリの問題に悩まされているのは残念です。必要なパッケージを更新するだけで、composer.lockファイルに煩わされることはありません。
GITとcomposerの場合の正しいワークフローと、上記の競合を解決する方法を教えてください。
ご意見ありがとうございます
開発者が自分でこの手順を実行しない場合、コア更新(または更新されるその他の依存関係)がそれを使用するプロジェクトで問題を起こさないことをどのようにテストできますか?
そのため、通常のワークフローでは、十分なRAM(つまり、PHPのメモリ制限として1GB以上が設定されている)の開発マシンでcomposer update
が実行されることを想定しており、更新は次のようになります。開発者によって手動でトリガーされます(継続的インテグレーションビルドによって自動的にトリガーされる場合、メモリ要件はこのマシンにも適用されます)。
このメモリ要件を回避する方法はありません。 512 MB RAMがインストールされているWebサーバーは、同時ユーザーがほとんど存在しないステージングサーバーとして機能できる可能性がありますが、Composer依存関係。
個人的には、composer.lock
のマージの競合を非常に簡単なシステムで修正します。ロックファイルを削除して、composer update
を実行します。これにより、すべての依存関係がバージョン要件を満たす最新バージョンに更新され、マージ中にコミットされる新しい作業用composer.lock
ファイルが作成されます。
期待どおりに機能するか、テストでエラーがすぐに検出されるため、すべてを更新する可能性があることを恐れていません。
慎重に使用するサードパーティのパッケージを選択します。
これは、ローカルのSatisインスタンスによって提供される約270個のパッケージで機能します(おそらく、メモリフットプリントを削減しようとするときに考慮すべき要素です。Composerであることがわかっているパッケージのみがメモリに格納されます:10個を比較してください) packagist.orgで270個のローカルパッケージとともに利用できる可能性のある1000個のパッケージ)270個の60個のパッケージが20人の開発者によってローカルで開発され、新しいバージョンがランダムにリリースされています。過去2年間の更新の失敗は非常にまれであり、他のパッケージと同様に処理する必要があります。バグ:タグ付けされたバージョンに互換性がないことが検出された場合、変更を元に戻すバグ修正リリースをリリースし、互換性のない変更が必要な場合は、元の変更に新しいメジャーリリースのタグを付けます。
したがって、要求するワークフローはおそらく次のようになります。
composer update
を実行できるはずです。composer.lock
ファイルを含む変更をGitにコミットしますcomposer install
のみを実行し、開発者が自分のマシンで使用したバージョンを正確に使用します。すでにコミットされているバージョンを別の開発者のマシンにマージすると、composer.lock
とのマージの競合が表示される可能性があります。
composer.lock
ファイルを削除する必要があります。composer update
を実行できる必要があります。別のアプローチ(composer update
を実行せずに):
composer.json
から別のテキストファイルにコピーします。composer.json
ファイルとcomposer.lock
ファイル全体を使用します。composer install
composer require vendor/package:version
を実行します。composer remove vendor/package
を実行します。このメソッドは、リモートブランチ(おそらくmaster
またはdevelop
ブランチ)からのロックを保持し、新しいパッケージのみを更新します。