createMigration method
Future<MigrationVersion?>
createMigration({
- String? tag,
- required bool force,
- required GeneratorConfig config,
- bool write = true,
Creates a new migration version.
If tag is specified, the migration will be tagged with the given name.
If force is true, the migration will be created even if there are
warnings.
If write is false, the migration will not be written to disk.
Returns the migration version, or null if no migration was created.
Throws MigrationVersionLoadException if the a migration version
could not be loaded.
Throws GenerateMigrationDatabaseDefinitionException if the database
definition could not be created from project models.
Throws MigrationVersionAlreadyExistsException if the migration version
already exists.
Implementation
Future<MigrationVersion?> createMigration({
String? tag,
required bool force,
required GeneratorConfig config,
bool write = true,
}) async {
var migrationRegistry = MigrationRegistry.load(
MigrationConstants.migrationsBaseDirectory(directory),
);
var databaseDefinitionLatest = await _getSourceDatabaseDefinition(
projectName,
migrationRegistry.getLatest(),
);
var models = await ModelHelper.loadProjectYamlModelsFromDisk(
config,
);
var modelDefinitions = StatefulAnalyzer(config, models, (uri, collector) {
collector.printErrors();
if (collector.hasSevereErrors) {
throw GenerateMigrationDatabaseDefinitionException();
}
}).validateAll();
var databaseDefinitionProject = createDatabaseDefinitionFromModels(
modelDefinitions,
config.name,
config.modulesAll,
);
var databaseDefinitions = await _loadModuleDatabaseDefinitions(
config.modulesDependent,
directory,
);
var versionName = createVersionName(tag);
var nextMigrationVersion = DatabaseMigrationVersion(
module: projectName,
version: versionName,
);
var databaseDefinitionNext = _mergeDatabaseDefinitions(
databaseDefinitionProject,
databaseDefinitions,
nextMigrationVersion,
);
var migration = generateDatabaseMigration(
databaseSource: databaseDefinitionLatest,
databaseTarget: databaseDefinitionNext,
);
var warnings = migration.warnings;
_printWarnings(warnings);
if (warnings.isNotEmpty && !force) {
log.info('Migration aborted. Use --force to ignore warnings.');
return null;
}
if (migration.isEmpty && !force) {
log.info(
'No changes detected. Use --force to create an empty migration.',
);
return null;
}
var migrationVersion = MigrationVersion(
moduleName: projectName,
projectDirectory: directory,
versionName: versionName,
migration: migration,
databaseDefinitionProject: databaseDefinitionProject,
databaseDefinitionFull: databaseDefinitionNext,
);
if (write) {
var removedModules = _removedModulesDiff(
databaseDefinitionLatest.installedModules,
databaseDefinitionNext.installedModules,
);
await migrationVersion.write(
installedModules: databaseDefinitionNext.installedModules,
removedModules: removedModules,
);
migrationRegistry.add(versionName);
await migrationRegistry.write();
}
return migrationVersion;
}