U principle
This commit is contained in:
parent
eb87cffb61
commit
1d1a3b32f9
|
|
@ -117,6 +117,32 @@ and runs it again, on top of the auto-loaded copy. By copying with
|
||||||
`basename($sourcePath)` we keep the filenames identical, so the migrator
|
`basename($sourcePath)` we keep the filenames identical, so the migrator
|
||||||
deduplicates correctly.
|
deduplicates correctly.
|
||||||
|
|
||||||
|
### Anti-pattern: fresh-timestamp publish
|
||||||
|
|
||||||
|
The bug the filename-preserving publish prevents looks like this in a
|
||||||
|
service provider:
|
||||||
|
|
||||||
|
```php
|
||||||
|
// ❌ Anti-pattern — produces 1050 errors on every consumer
|
||||||
|
$this->publishes([
|
||||||
|
__DIR__ . '/../database/migrations/create_blax_files_table.php.stub'
|
||||||
|
=> $this->getMigrationFileName('create_blax_files_table.php'),
|
||||||
|
], 'files-migrations');
|
||||||
|
|
||||||
|
protected function getMigrationFileName(string $name): string
|
||||||
|
{
|
||||||
|
$timestamp = date('Y_m_d_His');
|
||||||
|
return $this->app->databasePath() . "/migrations/{$timestamp}_{$name}";
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Each `vendor:publish` produces a NEW filename. Combined with auto-load
|
||||||
|
this guarantees the table gets created twice and the second run dies
|
||||||
|
with `SQLSTATE[42S01]: 1050 Table 'files' already exists`. The fix is
|
||||||
|
either (a) `basename($sourcePath)` in the publish map to inherit the
|
||||||
|
source name, or (b) the `Schema::hasTable()` guards below — preferably
|
||||||
|
both. Reference fix: [Blax\Files\FilesServiceProvider::offerPublishing()](/home/a6a2f5842/Documents/Repos/laravel-files/src/FilesServiceProvider.php).
|
||||||
|
|
||||||
### Idempotency requirement
|
### Idempotency requirement
|
||||||
|
|
||||||
Every migration MUST be safe to run when its tables/columns already
|
Every migration MUST be safe to run when its tables/columns already
|
||||||
|
|
@ -127,6 +153,30 @@ people *will* end up with both a published copy (with a different
|
||||||
timestamp) and the auto-loaded copy, and we want graceful degradation
|
timestamp) and the auto-loaded copy, and we want graceful degradation
|
||||||
instead of fatal errors.
|
instead of fatal errors.
|
||||||
|
|
||||||
|
### Workbench schema must mirror the package schema
|
||||||
|
|
||||||
|
The workbench `database/migrations/` directory is what your test suite
|
||||||
|
runs against. It must reflect the SAME schema a consumer would see —
|
||||||
|
either by:
|
||||||
|
|
||||||
|
- **Letting the package auto-load do the work.** Don't reimplement the
|
||||||
|
package's own `Schema::create` calls in the workbench. The service
|
||||||
|
provider's `loadMigrationsFrom` fires during test boot too, so the
|
||||||
|
package's own migrations create the tables in the testbench DB. The
|
||||||
|
workbench only needs migrations for tables the *consumer* would
|
||||||
|
provide (`users`, host-app fixture tables like `articles`).
|
||||||
|
- **Or, if the workbench duplicates the package schema for isolation,
|
||||||
|
keeping it in lockstep with model changes.** When `Filable` switched
|
||||||
|
to `HasUuids`, the workbench `filables` table needed the matching
|
||||||
|
`uuid('id')`. Skipping the workbench update means the test suite
|
||||||
|
silently rots — 39 tests went red in laravel-files for ~5 weeks
|
||||||
|
before anyone noticed, because nothing in CI was screaming about
|
||||||
|
the model/schema mismatch.
|
||||||
|
|
||||||
|
Pick the first option for new packages. It's less code and
|
||||||
|
self-consistent: a passing test suite proves the consumer's install
|
||||||
|
flow works.
|
||||||
|
|
||||||
### Deviation: laravel-addresses
|
### Deviation: laravel-addresses
|
||||||
|
|
||||||
`laravel-addresses` keeps the original `create_blax_address_tables.php.stub`
|
`laravel-addresses` keeps the original `create_blax_address_tables.php.stub`
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue