背景
phpプラグインを有効にしているJetBrains IntelliJで、とあるphp拡張を利用した実装をしたとき下記のような警告がでた
ext-json is missing in composer.json
「ext-jsonって確か組み込みモジュールだよなー。足りないはずはないし、なんで警告でるねん!」と思って調べたことをまとめておく
ext-json
ext-jsonは、json_encode()やjson_decode()などを提供する、phpでjsonを扱うための拡張モジュールのこと
ドキュメントに記載の通りphp5.2以降はデフォルト組み込みとなっている
ちなみに、自分はphp5.3以降しか触ったこと無いのでjson系関数が拡張モジュールであることは今回調べるまで知らなかった
なぜ警告が出るのか
「エラー調査の基本はグーグル先生に聞く!」
シンプルに ext-json is missing in composer.json
というエラーメッセージでググったところ、JetBrainsの記事がヒットしてドンピシャだった
PhpStorm 2018.2 EAP 182.3458.35 | 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拡張も明示しろっていうのは面倒だなとは思うけど、composerもIntelliJも便利に使わせてもらっているのでそのぐらいの手間は惜しむべきではないか
まとめ
- composerは、組み込みを含むすべてのphp拡張をcomposer.jsonで明示するべきと考えている
- 上記のcomposerの考え方に従って JetBrains PhpStorm 2018.2 EAP build (182.3458.35) 以降、composer.jsonで明示されていないphp拡張を利用した場合に警告を出す