Browse Source

İmplement DatabaseManagementSystemChangeStep & migration recreater

pull/6737/head
Yunus Emre Kalkan 6 years ago
parent
commit
83f9d34120
  1. 58
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs
  2. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseManagementSystem.cs
  3. 68
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs
  4. 1
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs
  5. 46
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/EfCoreMigrationRecreater.cs

58
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs

@ -1,6 +1,7 @@
using System; using System;
using System.Diagnostics; using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
@ -16,6 +17,7 @@ using Volo.Abp.Cli.ProjectBuilding;
using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building;
using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console; using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectModification;
using Volo.Abp.Cli.Utils; using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Threading; using Volo.Abp.Threading;
@ -24,14 +26,17 @@ namespace Volo.Abp.Cli.Commands
{ {
public class NewCommand : IConsoleCommand, ITransientDependency public class NewCommand : IConsoleCommand, ITransientDependency
{ {
private readonly EfCoreMigrationRecreater _efCoreMigrationRecreater;
public ILogger<NewCommand> Logger { get; set; } public ILogger<NewCommand> Logger { get; set; }
protected TemplateProjectBuilder TemplateProjectBuilder { get; } protected TemplateProjectBuilder TemplateProjectBuilder { get; }
public ITemplateInfoProvider TemplateInfoProvider { get; } public ITemplateInfoProvider TemplateInfoProvider { get; }
public NewCommand(TemplateProjectBuilder templateProjectBuilder public NewCommand(TemplateProjectBuilder templateProjectBuilder
, ITemplateInfoProvider templateInfoProvider) , ITemplateInfoProvider templateInfoProvider,
EfCoreMigrationRecreater efCoreMigrationRecreater)
{ {
_efCoreMigrationRecreater = efCoreMigrationRecreater;
TemplateProjectBuilder = templateProjectBuilder; TemplateProjectBuilder = templateProjectBuilder;
TemplateInfoProvider = templateInfoProvider; TemplateInfoProvider = templateInfoProvider;
@ -84,22 +89,29 @@ namespace Volo.Abp.Cli.Commands
Logger.LogInformation("Database provider: " + databaseProvider); Logger.LogInformation("Database provider: " + databaseProvider);
} }
var connectionString = GetConnectionString(commandLineArgs);
if (connectionString != null)
{
Logger.LogInformation("Connection string: " + connectionString);
}
var databaseManagementSystem = GetDatabaseManagementSystem(commandLineArgs); var databaseManagementSystem = GetDatabaseManagementSystem(commandLineArgs);
if (databaseManagementSystem != DatabaseManagementSystem.NotSpecified) if (databaseManagementSystem != DatabaseManagementSystem.NotSpecified)
{ {
Logger.LogInformation("DBSM: " + databaseManagementSystem); Logger.LogInformation("DBMS: " + databaseManagementSystem);
} }
var uiFramework = GetUiFramework(commandLineArgs); if (databaseManagementSystem != DatabaseManagementSystem.NotSpecified
if (uiFramework != UiFramework.NotSpecified) && databaseManagementSystem != DatabaseManagementSystem.SQLServer
&& connectionString == null)
{ {
Logger.LogInformation("UI Framework: " + uiFramework); throw new CliUsageException($"Connection string must be set if a Database Management System other than SQLServer is set. Use \"--{Options.ConnectionString.Long}\" parameter to set connection string");
} }
var connectionString = GetConnectionString(commandLineArgs); var uiFramework = GetUiFramework(commandLineArgs);
if (connectionString != null) if (uiFramework != UiFramework.NotSpecified)
{ {
Logger.LogInformation("Connection string: " + connectionString); Logger.LogInformation("UI Framework: " + uiFramework);
} }
var mobileApp = GetMobilePreference(commandLineArgs); var mobileApp = GetMobilePreference(commandLineArgs);
@ -203,6 +215,8 @@ namespace Volo.Abp.Cli.Commands
} }
} }
ReCreateMigrationsIfNeeded(databaseProvider, databaseManagementSystem, outputFolder);
Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'"); Logger.LogInformation($"'{projectName}' has been successfully created to '{outputFolder}'");
if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name)) if (AppTemplateBase.IsAppTemplate(template ?? (await TemplateInfoProvider.GetDefaultAsync()).Name))
@ -212,6 +226,23 @@ namespace Volo.Abp.Cli.Commands
} }
} }
private void ReCreateMigrationsIfNeeded(DatabaseProvider databaseProvider, DatabaseManagementSystem databaseManagementSystem, string outputFolder)
{
if (databaseManagementSystem == DatabaseManagementSystem.NotSpecified || databaseManagementSystem == DatabaseManagementSystem.SQLServer)
{
return;
}
if (databaseProvider != DatabaseProvider.NotSpecified && databaseProvider != DatabaseProvider.EntityFrameworkCore)
{
return;
}
Logger.LogInformation($"Re-creating migrations... ({databaseManagementSystem})");
_efCoreMigrationRecreater.Recreate(outputFolder);
}
private void OpenThanksPage(UiFramework uiFramework, DatabaseProvider databaseProvider, bool tiered, bool commercial) private void OpenThanksPage(UiFramework uiFramework, DatabaseProvider databaseProvider, bool tiered, bool commercial)
{ {
uiFramework = uiFramework == UiFramework.NotSpecified || uiFramework == UiFramework.None ? UiFramework.Mvc : uiFramework; uiFramework = uiFramework == UiFramework.NotSpecified || uiFramework == UiFramework.None ? UiFramework.Mvc : uiFramework;
@ -274,7 +305,7 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine("-ts|--template-source <template-source> (your local or network abp template source)"); sb.AppendLine("-ts|--template-source <template-source> (your local or network abp template source)");
sb.AppendLine("-csf|--create-solution-folder (default: true)"); sb.AppendLine("-csf|--create-solution-folder (default: true)");
sb.AppendLine("-cs|--connection-string <connection-string> (your database connection string)"); sb.AppendLine("-cs|--connection-string <connection-string> (your database connection string)");
sb.AppendLine("--dbms <database-management-system> (your database management system)"); sb.AppendLine("--dbms <database-management-system> (your database management system. Requires --connection-string to be set)");
sb.AppendLine("--tiered (if supported by the template)"); sb.AppendLine("--tiered (if supported by the template)");
sb.AppendLine("--no-ui (if supported by the template)"); sb.AppendLine("--no-ui (if supported by the template)");
sb.AppendLine("--no-random-port (Use template's default ports)"); sb.AppendLine("--no-random-port (Use template's default ports)");
@ -297,7 +328,7 @@ namespace Volo.Abp.Cli.Commands
sb.AppendLine(" abp new Acme.BookStore -ts \"D:\\localTemplate\\abp\""); sb.AppendLine(" abp new Acme.BookStore -ts \"D:\\localTemplate\\abp\"");
sb.AppendLine(" abp new Acme.BookStore -csf false"); sb.AppendLine(" abp new Acme.BookStore -csf false");
sb.AppendLine(" abp new Acme.BookStore --local-framework-ref --abp-path \"D:\\github\\abp\""); sb.AppendLine(" abp new Acme.BookStore --local-framework-ref --abp-path \"D:\\github\\abp\"");
sb.AppendLine(" abp new Acme.BookStore --dbms mysql"); sb.AppendLine(" abp new Acme.BookStore --dbms mysql --connection-string \"Server=myServerName\\myInstanceName;Database=myDatabase;User Id=myUsername;Password=myPassword\"");
sb.AppendLine(" abp new Acme.BookStore --connection-string \"Server=myServerName\\myInstanceName;Database=myDatabase;User Id=myUsername;Password=myPassword\""); sb.AppendLine(" abp new Acme.BookStore --connection-string \"Server=myServerName\\myInstanceName;Database=myDatabase;User Id=myUsername;Password=myPassword\"");
sb.AppendLine(""); sb.AppendLine("");
sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI"); sb.AppendLine("See the documentation for more info: https://docs.abp.io/en/abp/latest/CLI");
@ -326,7 +357,7 @@ namespace Volo.Abp.Cli.Commands
protected virtual DatabaseManagementSystem GetDatabaseManagementSystem(CommandLineArgs commandLineArgs) protected virtual DatabaseManagementSystem GetDatabaseManagementSystem(CommandLineArgs commandLineArgs)
{ {
var optionValue = commandLineArgs.Options.GetOrNull(Options.DatabaseManagementSystem.Long); var optionValue = commandLineArgs.Options.GetOrNull(Options.DatabaseManagementSystem.Short, Options.DatabaseManagementSystem.Long);
if (optionValue == null) if (optionValue == null)
{ {
@ -343,6 +374,8 @@ namespace Volo.Abp.Cli.Commands
return DatabaseManagementSystem.PostgreSQL; return DatabaseManagementSystem.PostgreSQL;
case "oracle": case "oracle":
return DatabaseManagementSystem.Oracle; return DatabaseManagementSystem.Oracle;
case "oracle-devart":
return DatabaseManagementSystem.OracleDevart;
case "sqlite": case "sqlite":
return DatabaseManagementSystem.SQLite; return DatabaseManagementSystem.SQLite;
default: default:
@ -399,7 +432,8 @@ namespace Volo.Abp.Cli.Commands
public static class DatabaseManagementSystem public static class DatabaseManagementSystem
{ {
public const string Long = "dbsm"; public const string Short = "dbms";
public const string Long = "database-management-system";
} }
public static class OutputFolder public static class OutputFolder

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/DatabaseManagementSystem.cs

@ -7,6 +7,7 @@
MySQL, MySQL,
PostgreSQL, PostgreSQL,
Oracle, Oracle,
OracleDevart,
SQLite SQLite
} }
} }

68
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/DatabaseManagementSystemChangeStep.cs

@ -1,13 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files; using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Text;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{ {
@ -17,24 +10,65 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{ {
switch (context.BuildArgs.DatabaseManagementSystem) switch (context.BuildArgs.DatabaseManagementSystem)
{ {
case DatabaseManagementSystem.NotSpecified:
return;
case DatabaseManagementSystem.SQLServer:
return;
case DatabaseManagementSystem.MySQL: case DatabaseManagementSystem.MySQL:
return; ChangeEntityFrameworkCoreDependency(context,"Volo.Abp.EntityFrameworkCore.MySQL",
"Volo.Abp.EntityFrameworkCore.MySQL",
"AbpEntityFrameworkCoreMySQLModule");
ChangeUseSqlServer(context,"UseMySql");
break;
case DatabaseManagementSystem.PostgreSQL: case DatabaseManagementSystem.PostgreSQL:
return; ChangeEntityFrameworkCoreDependency(context,"Volo.Abp.EntityFrameworkCore.PostgreSql",
"Volo.Abp.EntityFrameworkCore.PostgreSql",
"AbpEntityFrameworkCorePostgreSqlModule");
ChangeUseSqlServer(context,"UseNpgsql");
break;
case DatabaseManagementSystem.Oracle: case DatabaseManagementSystem.Oracle:
return; ChangeEntityFrameworkCoreDependency(context,"Volo.Abp.EntityFrameworkCore.Oracle",
"Volo.Abp.EntityFrameworkCore.Oracle",
"AbpEntityFrameworkCoreOracleModule");
ChangeUseSqlServer(context,"UseOracle");
break;
case DatabaseManagementSystem.OracleDevart:
ChangeEntityFrameworkCoreDependency(context,"Volo.Abp.EntityFrameworkCore.Oracle.Devart",
"Volo.Abp.EntityFrameworkCore.Oracle.Devart",
"AbpEntityFrameworkCoreOracleDevartModule");
ChangeUseSqlServer(context,"UseOracle");
break;
case DatabaseManagementSystem.SQLite: case DatabaseManagementSystem.SQLite:
return; ChangeEntityFrameworkCoreDependency(context,"Volo.Abp.EntityFrameworkCore.Sqlite",
"Volo.Abp.EntityFrameworkCore.Sqlite",
"AbpEntityFrameworkCoreSqliteModule");
ChangeUseSqlServer(context,"UseSqlite");
break;
default:
return;
} }
} }
private void ChangeEntityFrameworkCoreDependency(ProjectBuildContext context, string newPackageName, string newModuleNamespace, string newModuleClass)
{
var efCoreProjectFile = context.Files.First(f => f.Name.EndsWith("EntityFrameworkCore.csproj", StringComparison.OrdinalIgnoreCase));
efCoreProjectFile.ReplaceText("Volo.Abp.EntityFrameworkCore.SqlServer", newPackageName);
var efCoreModuleClass = context.Files.First(f => f.Name.EndsWith("EntityFrameworkCoreModule.cs", StringComparison.OrdinalIgnoreCase));
efCoreModuleClass.ReplaceText("Volo.Abp.EntityFrameworkCore.SqlServer", newModuleNamespace);
efCoreModuleClass.ReplaceText("AbpEntityFrameworkCoreSqlServerModule", newModuleClass);
}
private void ChangeUseSqlServer(ProjectBuildContext context, string newUseMethod)
{
var oldUseMethod = "UseSqlServer";
var efCoreModuleClass = context.Files.First(f => f.Name.EndsWith("EntityFrameworkCoreModule.cs", StringComparison.OrdinalIgnoreCase));
efCoreModuleClass.ReplaceText(oldUseMethod, newUseMethod);
var dbContextFactoryFile = context.Files.First(f => f.Name.EndsWith("MigrationsDbContextFactory.cs", StringComparison.OrdinalIgnoreCase));
dbContextFactoryFile.ReplaceText(oldUseMethod, newUseMethod);
}
} }
} }

1
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateProjectBuildPipelineBuilder.cs

@ -32,7 +32,6 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
pipeline.Steps.Add(new RemoveRootFolderStep()); pipeline.Steps.Add(new RemoveRootFolderStep());
} }
if (context.BuildArgs.ConnectionString != null) if (context.BuildArgs.ConnectionString != null)
{ {
pipeline.Steps.Add(new ConnectionStringChangeStep()); pipeline.Steps.Add(new ConnectionStringChangeStep());

46
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/EfCoreMigrationRecreater.cs

@ -0,0 +1,46 @@
using System;
using System.IO;
using System.Linq;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Cli.ProjectModification
{
public class EfCoreMigrationRecreater : ITransientDependency
{
public ILogger<EfCoreMigrationRecreater> Logger { get; set; }
public EfCoreMigrationRecreater()
{
Logger = NullLogger<EfCoreMigrationRecreater>.Instance;
}
public void Recreate(string solutionFolder)
{
if (Directory.Exists(Path.Combine(solutionFolder, "aspnet-core")))
{
solutionFolder = Path.Combine(solutionFolder, "aspnet-core");
}
var srcFolder = Path.Combine(solutionFolder, "src");
try
{
var migrationsFolder = Directory.GetDirectories(srcFolder).First(d => d.EndsWith(".EntityFrameworkCore.DbMigrations"));
Directory.Delete(Path.Combine(migrationsFolder, "Migrations"), true);
var migratorFolder = Directory.GetDirectories(srcFolder).First(d => d.EndsWith(".DbMigrator"));
var migratorProjectFile = Directory.GetFiles(migratorFolder).First(d => d.EndsWith(".DbMigrator.csproj"));
var addMigrationCommand = $"dotnet ef migrations add Initial --startup-project {migratorProjectFile}";
CmdHelper.RunCmd($"cd {migrationsFolder} && {addMigrationCommand}");
}
catch (Exception e)
{
Logger.LogWarning($"\"Re-creating migrations process failed.");
throw e;
}
}
}
}
Loading…
Cancel
Save