👮
composer-require-checkerでバグを防ぐ・利用ライブラリをひと目で分かるようにする
composer-require-checker
composer-require-checkerは、利用しているライブラリ・php拡張を
composer.json(require)で全て記載できているかのチェッカーです。(開発環境のみで利用するライブラリ除く)
メリット
- 開発環境で利用している(require-dev)ライブラリを本番稼働するコードで利用しエラーになることを防ぐ
- 下記記事で言われていることの対策になります
- http://dqn.sakusakutto.jp/2014/07/php_composer_require-dev.html
- composer.jsonを見れば実コードで使っているライブラリ・フレームワークがひと目で分かる
- 例えば、laravel/laravelをインストールするとilluminate/supportも芋づるでインストールされるがcomposer.jsonのrequireに記載されない。Illuminate\Support\Facades\DBを使った場合、composer.jsonに記載がない為このツールで検出されます。
補足
- 最新版(4.0.0)は>=PHP8.0.2
- composer-require-checker.pharをダウンロードして利用(Laravelのルートに設置)
- 私の環境がPHP7.4だったため、v3.8.0を利用
https://github.com/maglnet/ComposerRequireChecker
実行結果
# php composer-require-checker.phar check composer.json
ComposerRequireChecker 3.8.0@537138b833ab0f9ad72b667a72bece2a765e88ab
The following 10 unknown symbols were found:
+--------------------------------------+--------------------+
| Unknown Symbol | Guessed Dependency |
+--------------------------------------+--------------------+
| DB | |
| GraphQL\Type\Definition\ResolveInfo | |
| gzdecode | ext-zlib |
| json_decode | ext-json |
| json_encode | ext-json |
| JSON_UNESCAPED_UNICODE | ext-json |
| mb_strlen | ext-mbstring |
| mb_strpos | ext-mbstring |
| simplexml_load_file | ext-SimpleXML |
| Symfony\Component\DomCrawler\Crawler | |
+--------------------------------------+--------------------+
対応
- 1.ext-xxx
- デフォルトでext-xxxは組み込みされているがcomposer.jsonに記載されていないためエラーになる
- 「composer require ext-json」でcomposer.json更新
- https://engineering.otobank.co.jp/?page=1600933810
- 2.composer.jsonで記載されているライブラリ・フレームワークの依存パッケージを利用
- 例)Symfony\Component\DomCrawler\Crawler
- composer require symfony/dom-crawlerで更新
- 例)Symfony\Component\DomCrawler\Crawler
- 3.Laravelの場合クラスエイリアスを利用すると、composer.jsonに記載されていてもエラーになる為クラスエイリアスを利用しない形に修正する
問題
クラスエイリアスのDB(Illuminate\Support\Facades\DB)を使っている影響なのか
「illuminate/support」をcomposer requireしても変わらなかった。
DBの部分を\Illuminate\Support\Facades\DBに書き換えることでエラーはでなくなる。
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Root composer.json requires illuminate/database ^8.76, found illuminate/database[v8.76.0, v8.76.1, v8.76.2, 8.x-dev] but these were not loaded, likely because it conflicts with another require.
Installation failed, reverting ./composer.json and ./composer.lock to their original content.
修正
$sql = DB::table('books')
↓
$sql = \Illuminate\Support\Facades\DB::table('books')
実行結果:(正常終了)
# php composer-require-checker.phar check composer.json
ComposerRequireChecker 3.8.0@537138b833ab0f9ad72b667a72bece2a765e88ab
There were no unknown symbols found.
Discussion