モヒカンメモ

髪色が定期的に変わることに定評のある(比較的)若者Webエンジニアの備忘録

IntelliJに "ext-json is missing in composer.json" って怒られる理由

PHPプラグインを有効にしている JetBrains IntelliJ を使って、PHP拡張を利用したとある実装をしたとき下記のような警告が出た

ext-json is missing in composer.json

f:id:pinkumohikan:20181012200158p:plain

「ext-jsonって確か組み込みのJSON読み書きモジュールだよなー。足りないはずはないし、なんで警告でるねん!」と思って調べたことをまとめておく

ext-json

ext-jsonは json_encode()json_decode() などを提供する、PHPでJSONを扱うための拡張モジュール

PHP: JSON - Manual

ドキュメントに記載の通り、PHP 5.2以降はデフォルト組み込みとなっているので追加インストールをせずとも利用可能になっている

なぜ警告が出るのか

「エラー調査の基本はグーグル先生に聞く!」

シンプルに ext-json is missing in composer.json というエラーメッセージでググったところ、JetBrainsのドンピシャ記事がヒットした

f:id:pinkumohikan:20181012200723p:plain

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の下記の考え方によるものらしい

getcomposer.org

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 で明示されていない場合に警告が表示される