composer require と composer remove
composer require A
した時に、以下の2つのライブラリがインストールされたとする。
- ライブラリA
- Aが依存しているライブラリB
この時、 composer.json
には A が追加され、 compose.lock
には A と B が追加される。
その後、 A が不要になったので、 composer remove A
とすると、 composer.lock
には B が残ってしまう。
どうにか B まできれいに消せないだろうか。
結論: composer.lock を作り直すしかない
このような不要なライブラリを composer.lock
から削除したい場合、 composer.lock
を生成し直すしかありません。
composer.lock
を削除した後に、 composer install
して、 composer.lock
を生成しなおせば、依存関係はきれいになります。
しかし、これをすると全てのライブラリのバージョンが上がってしまい、アプリが動かなくなる場合もあります。
composer.lock を作り直したくない
ではどうすればいいのでしょうか。
依存をきれいに消すコマンドは無い
ライブラリをアンインストールしつつ、依存しているライブラリも消すコマンドはありません。
なぜでしょうか。
A, B, C の3つのライブラリがあり、以下のような依存関係になっているとします。
A -> B <- C
この場合、Aを消す時にBを同時に消すことはできません(C -> B と依存しているため)。
ライブラリの依存関係は複雑なので、簡単に依存関係まで消すことはできないようです。
composer update コマンドをうまく使う
このような状況で、使われていないライブラリをうまく消すには、 composer update
コマンドを地道に叩くしかありません。
A を remove する前に、 composer.lock を見ます。 A が依存しているライブラリを確認します。
A -> B
と依存していたとします。
composer remove A
した後に、 composer update B
とすると、 B がどこからも使われていない場合、B が composer.lock
から消えます。
A が依存していたライブラリに対して、 composer update
を実行していくと、必要なライブラリは残り、不要なライブラリは消えます。
composer update する場合の注意点
A -> B -> C
のように、複雑な依存関係がある場合、 B, C, ... 全ての依存ライブラリに対して composer update
する必要があり、大変です。
結論
- 依存ライブラリが消えなくても気にしない方がいい
- どうしても消したいなら
composer.lock
を生成しなして大掃除するのがよい