package:discover — パッケージのサービスプロバイダーを自動で登録する
artisan
Laravel artisan package:discover
Laravel のパッケージ自動発見を手動で再実行するための Artisan コマンドです。
- カテゴリ:artisan
- 対象:Laravel 12 / PHP 8.4
- コマンド:
php artisan package:discover
- 関連:
config:cache, config:clear, cache:clear, vendor:publish
- 変更履歴:Laravel 8 で初登場。以降 9〜12 で動作は同一。
TL;DR
- 用途:Composer で追加したパッケージの Service Provider を手動で再登録。
- 最低限の使い方:
php artisan package:discover
- よくある罠
composer.json の extra.laravel が無いと対象外。
composer dump-autoload を忘れると検出されない。
- 本番環境では
--no-interaction を付けて実行。
概要
Laravel では composer.json の extra.laravel セクションで Service Provider を自動登録できます。
パッケージを追加した直後に自動発見が反映されない場合、php artisan package:discover を手動で実行して Service Provider を読み込ませます。CI/CD で composer install 後に必ず実行するのが一般的です。
構文 / シグネチャ
php artisan package:discover {--ansi} {--no-interaction}
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|
--ansi | bool | なし | false | ANSI カラーを有効化 |
--no-interaction | bool | なし | false | ユーザー入力を待たず実行 |
戻り値
例外 / 副作用
| 例外 | 原因 | 備考 |
|---|
RuntimeException | Composer の autoload ファイルが見つからない | composer install を先に実行 |
最小例
php artisan package:discover
実務例
# Composer で新しいパッケージを追加した後
composer install --no-dev --optimize-autoloader
php artisan package:discover --no-interaction
よくある落とし穴・注意
| 症状 / エラー | 原因 | 対処 |
|---|
RuntimeException: Autoload file not found | vendor/autoload.php が存在しない | composer install を先に実行 |
Nothing found, no changes made. | composer.json の extra.laravel に該当パッケージが無い | パッケージ側の設定を確認 |
| 長時間実行 | 大規模なプロジェクトで多くのパッケージが自動発見対象 | composer dump-autoload -o で最適化済み autoload を使用 |
| 失敗時にサービスプロバイダが登録されない | パッケージの ServiceProvider が providers 配列に正しく記載されていない | package:discover ではなく vendor:publish を実行 |
代替 / 関連 API と比較
| API | 主な用途 | 選択基準 |
|---|
composer dump-autoload | PSR-4 autoload の再生成 | PHP のクラスロードだけに関心 |
php artisan config:cache | アプリ設定をキャッシュ | 設定ファイルが更新された際 |
php artisan vendor:publish | パッケージのリソースを公開 | アセットや設定ファイルのコピーが必要 |
package:discover は Service Provider の自動登録に特化。
vendor:publish は リソースの公開。
composer dump-autoload は PHP クラスの autoload。
テスト例(Pest)
it('registers service providers after discovery', function () {
// composer install が既に完了している前提
$output = shell_exec('php artisan package:discover');
expect($output)->toContain('Discovery complete');
});
参考リンク