champs-libres/composer-bundle-migration
Composer plugin that syncs Doctrine migration files from installed bundles/packages into your root project on post-install/update. Configure destination via extra.appMigrationsDir (default app/DoctrineMigrations) and source via extra.migration-source (default Resources/migrations).
composer require champs-libres/composer-bundle-migration ~1.0
composer.json under scripts:
"scripts": {
"post-install-cmd": [
"ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations"
],
"post-update-cmd": [
"ComposerBundleMigration\\Composer\\Migrations::synchronizeMigrations"
]
}
composer update
This copies all migrations from installed bundles to your root project’s app/DoctrineMigrations (default).FOSUserBundle), but want them in your project for version control and customization.composer update to sync migrations to your root project. Now you can:
php bin/console doctrine:migrations:execute locally.Post-Install/Update Hooks:
composer install/update via post-install-cmd/post-update-cmd.Custom Migration Directories:
app/DoctrineMigrations by adding to composer.json:
"extra": {
"appMigrationsDir": "database/migrations/doctrine"
}
Bundle-Specific Source Paths:
Migrations/ instead of Resources/migrations).composer.json:
"extra": {
"migration-source": "Migrations"
}
Laravel-Specific Adaptations:
migrate command by ensuring your doctrine/orm migrations are in the synced directory.php artisan alias in ~/.bashrc:
alias migrate-doctrine="php bin/console doctrine:migrations:execute --up"
CI/CD Pipelines:
composer update to your CI workflow to ensure migrations are synced before testing.- run: composer update --no-interaction
composer update in a fresh clone to pull migrations from all bundles.composer.json or overriding the sync logic (see Extension Points)."scripts": {
"post-migrate-sync": [
"@post-update-cmd",
"php scripts/validate-migrations.php"
]
}
Race Conditions:
composer update concurrently with other processes (e.g., php artisan migrate) may cause file lock issues.--no-scripts for updates, then manually trigger sync.Duplicate Migrations:
git status to detect duplicates or add a pre-sync cleanup script:
find app/DoctrineMigrations -name "*.php" -type f -exec md5sum {} \; | sort | uniq -w32 -D
Permission Issues:
storage/ and app/ have correct permissions (e.g., chmod -R 775 storage app).Non-Standard Bundle Structures:
migration-source in the bundle’s composer.json or extend the sync logic (see below).Laravel’s migrate Command Conflicts:
migrations and Doctrine’s doctrine:migrations, ensure paths don’t clash.database/migrations for Laravel, app/DoctrineMigrations for Doctrine).COMPOSER_BUNDLE_MIGRATION_DEBUG=1 composer update
COMPOSER_BUNDLE_MIGRATION_DRY_RUN=1 composer update
var/log/composer-bundle-migration.log (if configured) for sync details.Extension Points:
Migrations class:
// In a custom Composer plugin
use ComposerBundleMigration\Composer\Migrations as BaseMigrations;
class CustomMigrations extends BaseMigrations {
protected function getSourcePaths(): array {
$paths = parent::getSourcePaths();
$paths[] = 'custom/path'; // Add extra directories
return $paths;
}
}
composer.json:
"scripts": {
"post-update-cmd": [
"CustomMigrations::synchronizeMigrations"
]
}
Git Ignore:
.gitignore if they’re auto-generated (e.g., by doctrine/orm):
app/DoctrineMigrations/*_Y-m-d_His.php
Backup Synced Migrations:
cp -r app/DoctrineMigrations app/DoctrineMigrations.bak
composer update
Symfony vs. Laravel:
# config/packages/doctrine_migrations.yaml
doctrine_migrations:
migrations_paths:
'ChampsLibres\ComposerBundleMigration': '%appMigrationsDir%'
Performance:
composer.json diffs:
// In a custom plugin
public function synchronizeMigrations() {
$updatedPackages = $this->getUpdatedPackages();
if (empty($updatedPackages)) return;
parent::synchronizeMigrations();
}
How can I help you explore Laravel packages today?