Migrácie len na publikovanie
Balík postavený na toolkite svoje migrácie nikdy nenačítava automaticky. Hostiteľská aplikácia ich publikuje a spustí migrátor:
php artisan vendor:publish --tag=comments-migrations
php artisan migrateDeklarácia migrácií
hasMigrations() publikuje každý súbor database/migrations/*.php. hasMigration() pridá jeden zdroj database/migrations/<name>.php.stub — používajte ju len pre súbory .php.stub, pretože súbory .php už zachytí hasMigrations(). Obe publikujú pod tagom <name>-migrations:
$package
->name('comments')
->hasMigrations() // every database/migrations/*.php
->hasMigration('create_comment_reactions_table'); // database/migrations/create_comment_reactions_table.php.stubČasové pečiatky a poradie
Každý súbor sa publikuje do database/migrations/<Y_m_d_His>_<name>.php, takže sa zaradí medzi vlastné migrácie hostiteľa. Ak balík dodáva viac migrácií, ich pečiatky sa posúvajú o jednu sekundu na súbor v poradí zoradenia adresára balíka — migrácie závislé od tabuliek iných migrácií tak stále bežia v správnom poradí. Migrácie .php.stub deklarované cez hasMigration() nasledujú po súboroch .php v poradí deklarácie. Všetky providery čerpajú z jedného kurzora pre celý proces, takže keď jeden beh vendor:publish publikuje viac balíkov, súbory každého balíka nasledujú za súbormi predchádzajúceho a pečiatky sa nezdieľajú. Časovú pečiatku, ktorou balík prípadne označil zdrojový súbor, nahradí pečiatka publikovania:
package: database/migrations/
2020_01_01_000000_create_comments_table.php
create_comment_votes_table.php
create_comment_reactions_table.php.stub
host, after vendor:publish --tag=comments-migrations: database/migrations/
2026_07_15_101500_create_comments_table.php
2026_07_15_101501_create_comment_votes_table.php
2026_07_15_101502_create_comment_reactions_table.phpOpätovné publikovanie je bezpečné
Resolver cieľa znovu použije súbor, do ktorého už bola migrácia publikovaná, bez ohľadu na jeho pečiatku. Vynútené opätovné publikovanie tak súbor prepíše na mieste namiesto toho, aby pridalo druhú, inak označenú kópiu toho istého Schema::create():
php artisan vendor:publish --tag=comments-migrations --forceVaše vlastné migrácie sa nikdy neprepíšu
Súbor sa považuje za skoršiu kópiu, len ak má rovnaký názov a zároveň obsah zdrojového súboru balíka — rozdiely v bielych znakoch, napríklad konce riadkov, sa ignorujú. Rovnomenná migrácia s iným obsahom — vlastná create_comments_table vašej aplikácie, migrácia iného balíka alebo kópia, ktorú ste po publikovaní upravili — sa nikdy neprepíše, ani s --force. Migrácia balíka sa publikuje vedľa nej pod novou časovou pečiatkou a o tom, ktorú si ponecháte, rozhodnete vy:
host, before: database/migrations/
2025_03_02_090000_create_comments_table.php your app's own — different contents
host, after vendor:publish --tag=comments-migrations --force:
2025_03_02_090000_create_comments_table.php untouched
2026_07_15_101500_create_comments_table.php the package's, published beside itUpravili ste publikovanú migráciu? Zmažte duplikát
Upravená kópia sa už nezhoduje so zdrojom balíka, takže ďalšie publikovanie tagu — s --force aj bez neho — pridá migráciu balíka znova vedľa nej, pod novou časovou pečiatkou. Rovnako to dopadne, keď nové vydanie balíka zmení migráciu, ktorú ste už publikovali. Dva súbory create_comments_table spôsobia, že php artisan migrate zlyhá s chybou „table already exists“. Ponechajte kópiu, ktorá už prebehla, novú zmažte a zmenu, o ktorú z nej stojíte, presuňte do vlastnej novej migrácie.
Pomocník MigrationPublisher
Logika pomenovania a cieľa je dostupná aj samostatne, ako RoundlyConsulting\PackageToolkit\Support\MigrationPublisher. destination() prijíma zdrojový súbor balíka, aby mohla pred opätovným použitím súboru hostiteľa porovnať obsah. nextTimestamp() vydá ďalšiu pečiatku publikovania z toho istého kurzora, ktorý používa základný provider — aktuálnu sekundu, alebo o sekundu neskoršiu než posledná vydaná v tomto procese —, takže migrácie vlastného publikovacieho príkazu sa zaradia za všetko ostatné publikované v tom istom behu:
use RoundlyConsulting\PackageToolkit\Support\MigrationPublisher;
MigrationPublisher::nameFor('2020_01_01_000000_create_comments_table.php');
// 'create_comments_table' — extension and any timestamp prefix stripped
MigrationPublisher::nameFor('create_comment_reactions_table.php.stub');
// 'create_comment_reactions_table'
MigrationPublisher::destination(
__DIR__.'/../database/migrations/create_comments_table.php', // the package source file
database_path('migrations'),
MigrationPublisher::nextTimestamp(),
);
// the file it was already published to (same name, same contents),
// or …/database/migrations/<Y_m_d_His>_create_comments_table.phpresetTimestamps() kurzor zabudne, takže ďalšou pečiatkou bude opäť aktuálna sekunda. Volajte ju v setUp() testovacej sady, ešte pred bootom aplikácie, ak testy fixujú pečiatky publikovania.
Keďže sa nič nenačítava automaticky, vlastná testovacia sada balíka musí migrácie spustiť explicitne — pozrite časť Testovanie.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.