PHPのパッケージ管理は「自由」と「責任」が重い

PHPの自由度はそのまま依存管理の難しさになる

結論から言うと、PHPのパッケージ管理が難しく感じられる理由は、
Composerが複雑だからではなく、PHPの自由度が高いからです。

PHPは書き方を強制しません。
フレームワークも任意、ディレクトリ構成も任意、実行方法も複数あります。

これは長所ですが、パッケージ管理では責任になります。
なぜなら、前提条件を自分で決めなければならないからです。

他言語との違い

他言語では、ある程度の前提があります。

  • Node.js:package.jsonが中心
  • Python:仮想環境前提
  • Ruby:Bundler前提

しかしPHPは違います。

  • フレームワークあり
  • フレームワークなし
  • 単一ファイル
  • 大規模アプリ

すべて同じ言語で成立します。
そのため、依存関係の前提をツールが決めてくれません。

Composerは決めてくれないツール

Composerは次を行います。

  • 依存解決
  • インストール
  • オートロード生成

しかし「どう使うか」は決めません。

例えば、

  • vendorをGitに含めるか
  • 本番でinstallするか
  • buildを分けるか

これらは運用次第です。

つまりComposerは自動化ツールではなく、
選択肢を提供するツールです。

自由の裏側で起きる問題

選択肢が多いと、チームごとに方法が変わります。

  • 本番でupdate
  • 手動でvendor編集
  • lock未管理

どれも動くことがあります。
しかし長期的に問題になります。

典型的な症状:

  • 環境差でバグ
  • 再現不能エラー
  • デプロイ不安定

ツールの問題ではなく、
前提が共有されていない問題です。

composer.lockの意味

composer.lockは単なるキャッシュではありません。

> 依存関係の確定状態

です。

これを共有すると、
誰が実行しても同じ構成になります。

逆に無視すると、
同じコードでも別のアプリケーションになります。

updateの扱いが難しい理由

composer update

便利なコマンドです。
しかし意味は大きいです。

  • バグ修正の取得
  • 仕様変更の取得

両方を同時に行います。

つまりメンテナンスではなく、
仕様変更に近い操作です。

自由に実行できる分、影響も大きくなります。

運用で決めるべきこと

最低限、チームで共有すべき項目です。

  • updateを行うタイミング
  • lockの扱い
  • 本番デプロイ手順

これがないと、
個人の判断で構成が変わります。

Composer自体は悪くありません。
ルールが無いことが問題になります。

注意点:簡単に使えることと安全は別

Composerはコマンド1つで動きます。

composer require package/name

簡単です。
しかしその影響は広範囲です。

  • 依存追加
  • バージョン変化
  • オートロード更新

コード1行より大きい変更になる場合もあります。

まとめ:自由は設計を要求する

PHPは自由な言語です。
Composerも同じです。

だからこそ、
運用ルールが設計になります。

  • いつ更新するか
  • どこでインストールするか
  • 何を共有するか

これを決めることで、
初めて安定した開発になります。

PHPのパッケージ管理が難しく見えるのは、
ツールが弱いからではありません。

選択の余地が多い分、判断が必要になるからです。
そしてそれは、開発をチーム活動として扱うときに避けられない部分でもあります。