猫でもわかるWebプログラミングと副業

本業Webエンジニア。副業でもWebエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

PHP の composer でパッケージを uninstall する時の正しいコマンドは何か

f:id:yoshiki_utakata:20210510220646p:plain

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

のような依存関係になっているとします。

この場合、 C -> B なので、Aを消す時に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 を生成しなして大掃除するのがよい