composer での`php`マイナーバージョン範囲指定制約
よく知られている通り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 プロジェクトでの
にて言及されています。このphpマイナーバージョン範囲指定制約については、laminasの各パッケージのほかroave、lcobucci/jwt などで知られるlcobucciのプロジェクトで採用されています。
経緯は違うようですが、vimeo/psalm
もこのチルダ指定でのアプローチになっています。
また、上述のlaminas-diactoros#117 を参照する形で、composer-normalizeや各PHPライブラリへのコントリビュートで著名なlocalheinzの各プロジェクトで指定戦略を変えています。
Discussion