モヒカンメモ

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

古めのLaravelアプリがComposer 2で動かない問題

少し古めのLaravelアプリケーションを保守していてComposer 2で composer install 出来ない問題にぶち当たったので、これから躓くひとのために記録を残しておく。

f:id:pinkumohikan:20211121151059p:plain
Error: @php artisan package:discover --ansi In PackageManifest.php line 131: Undefined index: name

ざっくりまとめ

  • 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の内部ファイルを参照する。

github.com

Composer 2になって内部ファイルのデータ構造が変更されたので、新データ構造に対応していない古いLaravelアプリケーションでは上述のエラーが起きる。

LaravelのIssueとしてはこれ。

github.com

上記Issueで作られたパッチがそれぞれ下記バージョンで取り込まれている。

github.com

github.com

ので、上記以上に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

🎉