やり方
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
いかがでしょう?