Skip to content

Laravel PackageManifest.php: Undefined index: name エラーの解決方法

問題

Laravelアプリケーションでcomposer updateまたはcomposer installを実行すると、以下のエラーが発生することがあります:

In PackageManifest.php line 122:
Undefined index: name

このエラーは、プロジェクトをサーバーにデプロイする際や、依存関係を更新する際によく発生します。

原因

このエラーは主に、LaravelのバージョンとComposerのバージョン間の互換性問題によって発生します。

Composer v2がリリースされた際に、installed.jsonファイルの構造が変更されました。Laravelの古いバージョン(5.5未満、6.20未満など)はこの新しい構造を正しく処理できず、PackageManifest.phpファイル内でnameインデックスが見つからないというエラーが発生します。

解決方法

推奨解決策:Laravelフレームワークのアップデート

最も確実な解決方法は、LaravelフレームワークをComposer v2と互換性のあるバージョンにアップデートすることです。

互換性のあるLaravelバージョン

  • Laravel 5.5 → 5.5.49以上
  • Laravel 5.6 → 5.6.40以上
  • Laravel 5.7 → 5.7.29以上
  • Laravel 5.8 → 5.8.38以上
  • Laravel 6.x → 6.20.0以上
  • Laravel 7.x以上 → 全てComposer v2と互換

手順:

  1. composer.jsonファイルでLaravelフレームワークのバージョンを更新:
json
"require": {
    "laravel/framework": "5.8.38"
}
  1. 依存関係を更新:
bash
composer update
  1. 必要に応じて他のパッケージの互換性も確認してください。

一時的な解決策:Composerのダウングレード

プロジェクトをすぐに更新できない場合、Composerをv1にダウングレードすることで一時的に問題を解決できます。

bash
composer self-update --1

注意点

Composer v1はメンテナンスモードになっており、パフォーマンスがv2よりも大幅に劣ります。これは一時的な解決策としてのみ使用してください。

別のアプローチ:プロジェクトローカルにComposer v1を使用

本番環境でComposerのバージョンを変更したくない場合:

  1. Composer公式サイトからComposer v1のcomposer.pharをダウンロード
  2. プロジェクトルートに配置
  3. 以下のコマンドで実行:
bash
php composer.phar install

クリーンインストール

依存関係のキャッシュが問題を引き起こしている場合:

bash
rm -rf vendor composer.lock
composer install

注意

プロダクション環境でcomposer updateを実行することは推奨されません。代わりに、開発環境で更新後にcomposer.lockをコミットし、本番環境ではcomposer installを使用してください。

根本原因と技術的詳細

この問題は、Composer v2でvendor/composer/installed.jsonファイルの構造が変更されたことにより発生します。

Composer v1の構造:

json
[
    {
        "name": "vendor/package",
        "version": "1.0.0",
        ...
    }
]

Composer v2の構造:

json
{
    "packages": [
        {
            "name": "vendor/package", 
            "version": "1.0.0",
            ...
        }
    ]
}

古いLaravelバージョンのPackageManifest.phpは、直接配列を期待しているため、新しい構造でエラーが発生します。修正されたバージョンでは以下のように条件分岐で処理されています:

php
if ($this->files->exists($path = $this->vendorPath.'/composer/installed.json')) {
    $installed = json_decode($this->files->get($path), true);
    $packages = $installed['packages'] ?? $installed;
}

予防策

  1. Laravelを定期的に最新の安定版に更新する
  2. 本番環境にデプロイする前に、開発環境でComposerの操作をテストする
  3. バージョン管理でcomposer.lockをコミットし、本番環境では常にcomposer installを使用する

まとめ

PackageManifest.phpUndefined index: nameエラーは、LaravelとComposerのバージョン不一致が原因です。推奨される解決方法はLaravelを互換性のあるバージョンに更新することであり、一時的な対策としてComposerのダウングレードやローカルComposerの使用も可能です。

プロジェクトの状況に応じて最適な解決方法を選択し、可能な限りフレームワークを最新の状態に保つことが、将来の互換性問題を防ぐ最良の方法です。