PHPプラグインを有効にしている JetBrains IntelliJ を使って、PHP拡張を利用したとある実装をしたとき下記のような警告が出た
ext-json is missing in composer.json
「ext-jsonって確か組み込みのJSON読み書きモジュールだよなー。足りないはずはないし、なんで警告でるねん!」と思って調べたことをまとめておく
ext-json
ext-jsonは json_encode()
や json_decode()
などを提供する、PHPでJSONを扱うための拡張モジュール
ドキュメントに記載の通り、PHP 5.2以降はデフォルト組み込みとなっているので追加インストールをせずとも利用可能になっている
なぜ警告が出るのか
「エラー調査の基本はグーグル先生に聞く!」
シンプルに ext-json is missing in composer.json
というエラーメッセージでググったところ、JetBrainsのドンピシャ記事がヒットした
PhpStorm 2018.2 EAP 182.3458.35 | The PhpStorm Blog
記事によると、
The inspection detects the usages of functions, constants, and classes from PHP extensions that are not listed in composer.json.
とある通り、新機能としてPHP拡張由来の定数や関数などに依存しているとき composer.json にその依存が明示されていることを検査するらしい
この仕様の根拠としては、Composerの下記の考え方によるものらしい
Note: It is important to list PHP extensions your project requires. Not all PHP installations are created equal: some may miss extensions you may consider as standard (such as ext-mysqli which is not installed by default in Fedora/CentOS minimal installation systems). Failure to list required PHP extensions may lead to a bad user experience: Composer will install your package without any errors but it will then fail at run-time. The composer show --platform command lists all PHP extensions available on your system. You may use it to help you compile the list of extensions you use and require. Alternatively you may use third party tools to analyze your project for the list of extensions used.
ざっくり意訳すると
- 依存しているものを明確にすることって大事だよね
- PHPと一言で言っても実行環境 (configure option) によって利用可能な拡張モジュールが違うこともあるよね
- アプリを動かすぞ!って段になって「○○モジュール足りないよ!」ってランタイムエラーになったらキレそうだよね
- そこんところ、composer.jsonに書いといてくれればアプリの実行前に「これ足りないよ」って警告してあげられるよ
実際、composer.jsonに必要な依存を明記しておくと composer install
したときに必要なPHP拡張が入ってなければ「○○が足りへんで!」みたいに怒ってくれるので実行環境を正しく構築出来ているかの確認はやりやすくなる
組み込みPHP拡張も明示しろっていうのは最初は面倒だなとは思うけど、「このPHP拡張はPHP いくつ以降だと組み込みなんだっけ?」とか考えるのも面倒なので "一律全部明記すべし" っていう仕様のほうがシンプルだと言えそう
まとめ
- Composerは、組み込みを含むすべてのPHP拡張を
composer.json
で明示するべきと考えている composer.json
で明示されたPHP拡張はcomposer install
コマンド実行時に検査され、拡張がインストールされていなければエラーを出してくれる- 上述のComposerの考え方に従いって JetBrains PhpStorm 2018.2 EAP build (182.3458.35) 以降、PHP拡張を利用しているのに
composer.json
で明示されていない場合に警告が表示される