やり方
Composerはrequire-devで開発環境だけに必要なパッケージを指定できるが、require-prodのような本番だけの指定はできない。
そこで、COMPOSER環境変数でcomposer.jsonファイルを指定することで特定の.jsonを使用することができる。
環境別に例えば、composer-prod.jsonやcomposer-dev.jsonを作成し、下記の様にパッケージの更新をかけることで、それぞれの環境でことなるパッケージをrequireすることができる。
COMPOSER=composer-dev.json composer update
.lockファイルもちゃんと使用した.jsonファイルのベースネームで作成してくれる。
例えば、composer-dev.jsonからはcomposer-dev.lockが生成される。
背景
そもそも、なぜこんなことをするかと言うと、OctoberCMSのようなプラグインアーキテクチャで、composer管理したメインプロジェクトのコードベースの中に、同時開発しているプラグインがある場合、composer updateすることで開発中のプラグインがリリース済みのバージョンで上書きされるのを防ぎたかったから。
composerの使い方次第ではあるが、自作プラグインもcomposerで同時にデプロイして欲しいのでcomposer.jsonのrequireに入れているため、このような問題が起こる。
この解決策としての自分のやり方はこうだ。
composer-dev.jsonのrequireには自作プラグインを含めない。
composer-prodstg.jsonのrequireに自分のプラグインを含める。
ステージング環境で下記でプラグインをデプロイする。
COMPOSER=composer-prodstg.json composer update
テストを実施して問題なければ、生成されたcomposer-prodstg.lockをコミットして本番では下記でステージングと同じパッケージ群をデプロイする。
COMPOSER=composer-prodstg.json composer install
いかがでしょう?