少し古めのLaravelアプリケーションを保守していてComposer 2で composer install
出来ない問題にぶち当たったので、これから躓くひとのために記録を残しておく。
ざっくりまとめ
- Composer 2になってComposer 内部データファイルのデータ構造が変わった
- LaravelにはComposer 内部データファイルを参照する処理があるため、パッチが当たる前のLaravelではComposer 2で動かない
- Composer 2を使いたければ、その前にLaravel 6.18.7、7.6.0以上へバージョンアップが必要
エラーメッセージ
$ composer --version Composer version 2.1.12 2021-11-09 16:02:04 $ composer install ...snip... Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi In PackageManifest.php line 131: Undefined index: name Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1
ざっくり解説
LaravelにはPackageManifestというクラスがあり、こいつはComposerの内部ファイルを参照する。
Composer 2になって内部ファイルのデータ構造が変更されたので、新データ構造に対応していない古いLaravelアプリケーションでは上述のエラーが起きる。
LaravelのIssueとしてはこれ。
上記Issueで作られたパッチがそれぞれ下記バージョンで取り込まれている。
ので、上記以上にLaravelをバージョンアップすることでComposer 2でも動くようになる。
検証
パッチが適用される前のlaravel/framework v7.5.2では動かない
bash-4.2# composer --version Composer version 2.1.12 2021-11-09 16:02:04 bash-4.2# composer require laravel/framework:7.5.2 ./composer.json has been updated ...snip... > @php artisan package:discover --ansi In PackageManifest.php line 131: Undefined index: name Script @php artisan package:discover --ansi handling the post-autoload-dump event returned with error code 1
パッチが適用された後のaravel/framework v7.6.0なら動く
bash-4.2# composer --version Composer version 2.1.12 2021-11-09 16:02:04 bash-4.2# composer require laravel/framework:7.6.0 ./composer.json has been updated ...snip... > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: fruitcake/laravel-cors Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 69 packages you are using are looking for funding. Use the `composer fund` command to find out more! bash-4.2# echo $? 0
🎉