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
  • よくある罠
  1. composer.jsonextra.laravel が無いと対象外。
  2. composer dump-autoload を忘れると検出されない。
  3. 本番環境では --no-interaction を付けて実行。

概要

Laravel では composer.jsonextra.laravel セクションで Service Provider を自動登録できます。
パッケージを追加した直後に自動発見が反映されない場合、php artisan package:discover を手動で実行して Service Provider を読み込ませます。CI/CD で composer install 後に必ず実行するのが一般的です。


構文 / シグネチャ

php artisan package:discover {--ansi} {--no-interaction}
引数必須既定値説明
--ansiboolなしfalseANSI カラーを有効化
--no-interactionboolなしfalseユーザー入力を待たず実行

戻り値

  • int:終了コード(0=成功、1=エラー)

例外 / 副作用

例外原因備考
RuntimeExceptionComposer の autoload ファイルが見つからないcomposer install を先に実行

最小例

php artisan package:discover

実務例

# Composer で新しいパッケージを追加した後
composer install --no-dev --optimize-autoloader
php artisan package:discover --no-interaction

よくある落とし穴・注意

症状 / エラー原因対処
RuntimeException: Autoload file not foundvendor/autoload.php が存在しないcomposer install を先に実行
Nothing found, no changes made.composer.jsonextra.laravel に該当パッケージが無いパッケージ側の設定を確認
長時間実行大規模なプロジェクトで多くのパッケージが自動発見対象composer dump-autoload -o で最適化済み autoload を使用
失敗時にサービスプロバイダが登録されないパッケージの ServiceProvider が providers 配列に正しく記載されていないpackage:discover ではなく vendor:publish を実行

代替 / 関連 API と比較

API主な用途選択基準
composer dump-autoloadPSR-4 autoload の再生成PHP のクラスロードだけに関心
php artisan config:cacheアプリ設定をキャッシュ設定ファイルが更新された際
php artisan vendor:publishパッケージのリソースを公開アセットや設定ファイルのコピーが必要
  • package:discoverService Provider の自動登録に特化。
  • vendor:publishリソースの公開
  • composer dump-autoloadPHP クラスの autoload

テスト例(Pest)

it('registers service providers after discovery', function () {
    // composer install が既に完了している前提
    $output = shell_exec('php artisan package:discover');
    expect($output)->toContain('Discovery complete');
});

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする