php 8.2.10 において、laravelのプロジェクトをクローンして、composer installしたときに出た。
git に上がってるものもphp8.2だと思ったが、マイナーバージョンによって違うのか。。。
とりあえず、netteのバージョンが、1.2で lockされているということなので、
composer.lockを探すと、確かに1.2で書いてあった。
これを消してもいいのだが、他の関連ファイルもあるので、composer.lockを削除して、composer.jsonのrequireに以下を追加
"nette/schema":"^1.2"
これである程度解決したが、以下の問題が出た。
対処法:
1. 依存関係の更新
まず、依存関係がアップグレード可能かを確認します:
bashコピーする編集するcomposer why nette/schema
これで、nette/schema
を要求しているパッケージがわかります。
2. バージョン制約を緩めてアップデート
もし composer.json
に直接指定されていないなら、以下のようにして依存関係の更新を試みます:
bashコピーする編集するcomposer update nette/schema
ただし、lockファイルの更新が前提なので、プロジェクトの整合性が崩れる可能性があります。
3. 互換性のあるバージョンに手動で上げる
nette/schema
の互換性のあるバージョン(例:v1.2.3
以降)に更新可能であれば、composer.json
に以下を追加:
jsonコピーする編集する"nette/schema": "^1.2.3"
そして:
bashコピーする編集するcomposer update nette/schema
4. PHPバージョンを下げる(非推奨)
一時的な回避策として、PHP のバージョンを 8.1 などに下げることも可能ですが、将来的な保守性を考えると推奨されません。
おすすめの進め方:
composer why nette/schema
で依存関係を特定- その依存元が Laravel のどのパッケージか確認
- Laravel のバージョンが古ければ、アップグレードも検討
In RecursiveDirectoryIterator.php line 43:
RecursiveDirectoryIterator::__construct(): Argument #1 ($directory) cannot be empty
Script @php artisan package:discover –ansi handling the post-autoload-dump event returned with error code 1
以上のエラーの解決ができずに、cloneしたものを使うのはやめた。
対処手順(順に試してみてください)
1. キャッシュ関連をクリアする
bashコピーする編集するrm -rf bootstrap/cache/*.php
php artisan config:clear
php artisan cache:clear
2. vendor
ディレクトリと composer.lock
を削除して再インストール
bashコピーする編集するrm -rf vendor composer.lock
composer install
3. パーミッションの確認
storage/
と bootstrap/cache/
に正しい書き込み権限があるか確認してください。
bashコピーする編集するchmod -R 775 storage bootstrap/cache
あるいは、必要に応じて:
bashコピーする編集するsudo chown -R $USER:www-data storage bootstrap/cache
4. 原因の特定(artisan コマンドを直接実行して詳細を見る)
bashコピーする編集するphp artisan package:discover
このコマンド単体で実行すると、何が原因で失敗しているかのエラー内容がより詳しく表示される可能性があります。
⚠️ よくある原因:
- PHP のバージョンが対応外(例:Laravel 6系 + PHP 8.2)
composer.lock
内の依存パッケージ(例:nette/schema
)が PHP バージョンと非互換.env
ファイルが存在しない(Laravel の一部のバージョンでは必須)- Laravel Mix やその他のフロント系パッケージが壊れている