ServiceProvider、VendorPublishCommand、Migrator を読み解きます。フレームワークの実装は v13.34.0 を参照しています。
コピーして渡すか、パッケージから読み込むか
publishesMigrations() は、コピー元とコピー先を公開対象として登録するだけです。プロバイダーを起動しても、ファイルのコピーやSQLの実行は行いません。
一方、loadMigrationsFrom() はMigratorに検索パスを登録します。通常の migrate でそのパスのファイルも対象になりますが、プロバイダーの起動だけでは実行されません。
利用者が実行前にテーブル名やカラムを調整する設計なら、公開方式が候補になります。パッケージがスキーマを管理し、利用者によるファイル編集を前提としないなら、直接読み込み方式も検討できます。以下の2つのプロバイダー例は代替案です。
公開方式を実装する
パッケージ固有のタグを付け、利用者が他のリソースと区別して公開できるようにします。タイムスタンプの変更には設定が関係する
公式ドキュメントは、公開時にマイグレーションのタイムスタンプを現在日時へ更新する動作を説明しています。ただし、ServiceProvider::publishesMigrations() の実装では、database.migrations.update_date_on_publish が有効な場合にだけ、コピー元をタイムスタンプ更新対象へ追加します。この設定を取得するときのフォールバックは false です。
Laravel 13の標準アプリケーションの config/database.php には、次の設定があります。旧構成を引き継いだアプリケーションでは、設定が存在するかも確認してください。
VendorPublishCommand は、登録されたコピー元の実パスと一致し、コピー先の名前に YYYY_MM_DD_HHMMSS_ 形式がある場合に日時を書き換えます。コマンド開始時刻を基準に、対象ファイルごとに1秒加算します。名前にこの形式がなければ、その処理では日時を付け足しません。
タイムスタンプ更新は、パッケージの登録と利用アプリケーションの設定の両方に依存します。パッケージのプロバイダーからこの設定を一律に変更せず、インストール手順に前提を記載してください。設定キャッシュを利用している場合は、設定変更後の再構築も必要です。
再公開は「未実行のものだけ追加」ではない
vendor:publish はDBの実行履歴を確認しません。また、v13.34.0 のコピー処理では、既存ファイルの確認をタイムスタンプの変更前のコピー先に対して行います。ディレクトリ公開でも、まずコピー元と同じ相対パスがコピー先にあるかを確認し、その後で日時を書き換えます。
そのため、最初の公開で日時が変わり、コピー元と同じ名前のファイルがアプリケーション側にない場合は、同じタグをもう一度公開すると別の日時のファイルが追加されることがあります。--force を付けなければ常に重複を防げる、とは考えないでください。
実行済みかどうかはファイル名で判断する
Migrator::getMigrationName() は、ファイルのベース名から .php を除いた文字列を返します。未実行の判定では、この名前と実行履歴を比較します。PHPの内容やテーブル名が同じかどうかによる判定ではありません。
直接読み込み方式を実装する
パッケージ内のマイグレーションをそのまま実行対象にしたい場合は、検索パスを登録します。この方式では、同じファイルを公開する処理は追加しません。loadMigrationsFrom() はMigratorが解決されたときに path() を呼びます。Migrator::path() は検索パスの重複を除き、getMigrationFiles() は見つけたファイルをマイグレーション名でキー付けして、その名前順に並べます。
利用者がパッケージを更新すると、新しいファイルは次の migrate の対象になります。既存ファイルの名前は変えず、新しいスキーマ変更には新しいファイルを追加します。他のパッケージとの衝突を避けるため、create_courier_deliveries_table のように機能名も含めてください。同名のファイルは同じキーになり、両方が独立して実行されるわけではありません。
スキーマ変更を既存利用者へ届ける
たとえば配送テーブルへ追跡番号を追加する場合は、公開済みのcreate_courier_deliveries_table を編集するのではなく、変更用の新しいファイルを追加します。既存の作成マイグレーションを編集しても、実行済みの利用者にはその変更が実行されません。
database/migrations/2026_10_02_000000_add_tracking_code_to_courier_deliveries_table.php
リリース前に確認すること
パッケージのDBテストに加えて、利用アプリケーションで公開と更新の手順を確認してください。テストでマイグレーションを直接読み込むだけでは、ファイル名が変わる公開方式を検証したことにはなりません。- 空のDBに初回インストールし、必要なテーブルを作成できる。
- 旧リリースのDBと実行履歴から更新し、新しい変更だけが適用される。
- 同じ公開コマンドを繰り返したときのファイル一覧を確認し、更新手順が重複を生まない。
- 日時更新の有効・無効と、公開済みファイルの編集を考慮した手順になっている。
- 新規マイグレーションのロールバックと、アプリケーションの他のマイグレーションとの実行順序を確認する。
関連ページ
マイグレーション
スキーマ定義、実行履歴、ロールバックの基本を確認します。
パッケージのテスト
パッケージのサービスプロバイダーとDBをテストします。
パッケージ設定のマージとキャッシュ
利用者の設定と設定キャッシュを考慮した更新手順を確認します。
バージョン互換性管理
更新手順と互換性の変更をリリース方針に結び付けます。