モヒカンは正義

プログラマー風林火山で言う「風のエンジニア」になりたい(比較的)若者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って確か組み込みモジュールだよなー。足りないはずはないし、なんで警告でるねん!」と思って調べたことをまとめておく

ext-json

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

PHP: JSON - Manual

ドキュメントに記載の通りphp5.2以降はデフォルト組み込みとなっている

ちなみに、自分はphp5.3以降しか触ったこと無いのでjson系関数が拡張モジュールであることは今回調べるまで知らなかった

なぜ警告が出るのか

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

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

f:id:pinkumohikan:20181012200723p:plain

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

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拡張も明示しろっていうのは面倒だなとは思うけど、composerもIntelliJも便利に使わせてもらっているのでそのぐらいの手間は惜しむべきではないか

まとめ

  • composerは、組み込みを含むすべてのphp拡張をcomposer.jsonで明示するべきと考えている
  • 上記のcomposerの考え方に従って JetBrains PhpStorm 2018.2 EAP build (182.3458.35) 以降、composer.jsonで明示されていないphp拡張を利用した場合に警告を出す