💽

composer での`php`マイナーバージョン範囲指定制約

2023/12/24に公開

よく知られている通りPHP本体のリリースは厳格なsemverではないです。
そこで問題となってくるのが、composer.jsonで記述されるphpバージョンの問題です。

よく見受けられる composerパッケージでのcomposer.jsonは以下のようなものです。

"require": {
  "php": "^8.1"
},

これの問題点として、(2023年12月現在の最新がPHP 8.3であるのに対し)「はたして PHP 8.4 で本当に動くのか?」といった点があります。
「たいていは動くでしょ?」の問いに対してはYESですし、deprecation NOTICEをシャーラップ! すればよいものが殆どではあります。

そしてまた、各PHPライブラリがCIで最新のPHPバージョンを含めたmatrixテストをしっかり行っていればよいのですが、何かしらのPHPへの追随が必要なケースも多々あるでしょう。

PHPのマイナーバージョンの指定は、そのマイナーバージョンでCIをパスしたときのみに含めるべき という戦略を持てます。
これにより、そのcomposerパッケージ利用者側が、古いライブラリバージョン指定のままで新しいPHPバージョンで利用してバグが発生する、という事態を防げます。

具体的には、composer.jsonでのphpバージョン指定を

"require": {
  "php": "~8.1.0 || ~8.2.0 || ~8.3.0"
},

と将来のマイナーバージョンを含めない形にすることです。

このphpバージョン指定方法を "phpマイナーバージョン範囲指定制約"と名付けたいと思います。(昨今のPHPライブラリ事情での日本語話者で言及する人はいないので、私が名付けます。。)

この範囲指定戦略については、主に laminas プロジェクトでの
https://github.com/laminas/laminas-diactoros/issues/117
にて言及されています。

このphpマイナーバージョン範囲指定制約については、laminasの各パッケージのほかroave、lcobucci/jwt などで知られるlcobucciのプロジェクトで採用されています。

経緯は違うようですが、vimeo/psalmもこのチルダ指定でのアプローチになっています。
https://github.com/vimeo/psalm/pull/7291

また、上述のlaminas-diactoros#117 を参照する形で、composer-normalizeや各PHPライブラリへのコントリビュートで著名なlocalheinzの各プロジェクトで指定戦略を変えています。
https://github.com/ergebnis/php-package-template/pull/1086

Discussion