vendor:publish — パッケージの資産を公開するコマンド

artisan

php artisan vendor:publish コマンドについての解説

一言概要

  • カテゴリ:artisan
  • 掲載バージョン:Laravel 12・PHP 8.4
  • 名前空間 / FQCN / コマンドvendor:publish / php artisan vendor:publish
  • 関連:config:cache, config:clear, view:clear, route:clear, event:cache
  • 変更履歴:5.2 追加 → 5.6 でタグ指定が必須に → 8.0 で --force のデフォルト無効化

要点(TL;DR)

  • 目的:パッケージの config・migration・view・asset 等をアプリへコピー
  • 最低限php artisan vendor:publish
  • よくある罠
  1. すべてを公開してしまう
  2. 既存ファイルとの競合
  3. キャッシュ未クリアで変更が反映されない

概要

vendor:publish は、パッケージの公開可能ファイルを指定してアプリにコピーします。
タグやプロバイダーを指定すると、必要なリソースだけを限定して公開できます。

構文 / シグネチャ

php artisan vendor:publish [options] [--] <args>

オプション表

オプション必須既定値説明
--providerstringいいえなし指定プロバイダーのファイルのみ公開
--tagstringいいえなしタグ付きファイルのみ公開(スペース区切り)
--forceflagいいえなし既存ファイルを上書き
--quietflagいいえなし出力を抑制
--ansiflagいいえなしANSI カラーを有効化
--no-ansiflagいいえなしANSI カラーを無効化

戻り値

  • コンソール出力(文字列)
  • 終了コード:成功 0、失敗 1

副作用

  • ファイルコピーとパスの書き込み
  • 既存ファイルの上書き(--force
  • config:cache, view:clear, route:clear 等のキャッシュクリアが必要になる場合がある

例外

  • RuntimeException:指定プロバイダーが見つからない
  • IOException:ファイル書き込み失敗

使用例

最小例

php artisan vendor:publish

実務例

# config と migrations だけ公開
php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" --tag="config,migrations"

# 既存ファイルを上書き
php artisan vendor:publish --provider="Vendor\Package\PackageServiceProvider" --force

よくある落とし穴・注意

症状/エラー原因対処
Invalid providerFQCN が誤っているphp artisan vendor:publish で確認
File exists, not overwriting--force が無い--force を付ける
キャッシュ残存config キャッシュが残るphp artisan config:clear を実行
パーミッション不足storage / bootstrap/cache が書き込み不可chmod -R 775 storage bootstrap/cache
CI 失敗権限・ロックの問題sudo chown -R $USER storage bootstrap/cache

代替・関連APIとの比較

手段メリットデメリット選択基準
--tag=...タグ単位で細かい制御タグが無いと使えない特定リソースのみ更新したい時
--provider=...プロバイダー全体をまとめて公開タグが混在すると全公開プロバイダー全体を管理したい時
無指定 vendor:publishすべてを一括で公開余計なファイルがコピーされる初回セットアップ時に一括公開したい時

テスト例(Pest)

it('publishes config files', function () {
    $this->artisan('vendor:publish', ['--tag' => 'config'])
         ->expectsOutput('Published [config/vendor.php]')
         ->assertExitCode(0);

    expect(config_path('vendor.php'))->toBeFile();
});

トラブルシュート(エラー別)

症状/エラー原因対処
Cannot create directory書き込み権限不足sudo chown -R $USER storage bootstrap/cache
File exists, not overwriting--force が無い--force を付与
Missing tagタグ未設定パッケージドキュメント確認
Cannot write fileファイルロック関連プロセスを停止または再起動

実行環境

  • 開発マシン(Laravel Sail, Homestead 等)
  • 本番サーバー(storagebootstrap/cache に 775/775 の書き込み権限が必要)
  • CI/CD 環境(パーミッションとキャッシュのクリアを事前に設定)

終了コード

コード状態
0成功(公開済み)
1失敗(例外・エラー)

参考リンク

レン (Wren)

こんにちは。レンです。

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

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

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

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

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

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