diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs index 59790a7c7d..19865bdacf 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs @@ -52,8 +52,9 @@ namespace Volo.Abp.Cli.Commands var result = await ProjectBuilder.BuildAsync( new ProjectBuildArgs( SolutionName.Parse(commandLineArgs.Target), + commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long), GetDatabaseProviderOrNull(commandLineArgs), - commandLineArgs.Options.GetOrNull(Options.Template.Short, Options.Template.Long) + commandLineArgs.Options ) ); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SwitchEntityFrameworkCoreToMongoDbStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SwitchEntityFrameworkCoreToMongoDbStep.cs deleted file mode 100644 index 4a6372f15a..0000000000 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/SwitchEntityFrameworkCoreToMongoDbStep.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System; -using Volo.Abp.Cli.ProjectBuilding.Files; - -namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps -{ - public class SwitchEntityFrameworkCoreToMongoDbStep : ProjectBuildPipelineStep - { - public override void Execute(ProjectBuildContext context) - { - ChangeProjectReference(context); - ChangeWebModuleUsage(context); - ChangeConnectionString(context); - } - - private void ChangeProjectReference(ProjectBuildContext context) - { - var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj"); - - file.NormalizeLineEndings(); - - var lines = file.GetLines(); - for (var i = 0; i < lines.Length; i++) - { - if (lines[i].Contains("ProjectReference") && lines[i].Contains("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations")) - { - lines[i] = lines[i].Replace("EntityFrameworkCore.DbMigrations", "MongoDB"); - file.SetLines(lines); - return; - } - } - - throw new ApplicationException("Could not find the EntityFrameworkCore reference in the MyCompanyName.MyProjectName.Web.csproj!"); - } - - private void ChangeWebModuleUsage(ProjectBuildContext context) - { - var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs"); - - file.NormalizeLineEndings(); - - file.RemoveTemplateCodeIfNot("EntityFrameworkCore"); - - var lines = file.GetLines(); - - for (var i = 0; i < lines.Length; i++) - { - if (lines[i].Contains("using MyCompanyName.MyProjectName.EntityFrameworkCore")) - { - lines[i] = "using MyCompanyName.MyProjectName.MongoDb;"; - } - else if (lines[i].Contains("MyProjectNameEntityFrameworkCoreModule")) - { - lines[i] = lines[i].Replace("MyProjectNameEntityFrameworkCoreModule", "MyProjectNameMongoDbModule"); - } - } - - file.SetLines(lines); - } - - private void ChangeConnectionString(ProjectBuildContext context) - { - var file = context.GetFile("/src/MyCompanyName.MyProjectName.Web/appsettings.json"); - - file.NormalizeLineEndings(); - - var lines = file.GetLines(); - for (var i = 0; i < lines.Length; i++) - { - if (lines[i].Contains("Default") && lines[i].Contains("Database")) - { - lines[i] = " \"Default\": \"mongodb://localhost:27017|MyProjectName\""; - file.SetLines(lines); - return; - } - } - - throw new ApplicationException("Could not find the 'Default' connection string in appsettings.json file!"); - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs index 6767a4e164..ca106c1f6e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/ProjectBuildArgs.cs @@ -1,4 +1,5 @@ -using JetBrains.Annotations; +using System.Collections.Generic; +using JetBrains.Annotations; using Volo.Abp.Cli.ProjectBuilding.Building; namespace Volo.Abp.Cli.ProjectBuilding @@ -13,14 +14,20 @@ namespace Volo.Abp.Cli.ProjectBuilding public DatabaseProvider DatabaseProvider { get; set; } + [NotNull] + public Dictionary ExtraProperties { get; set; } + public ProjectBuildArgs( [NotNull] SolutionName solutionName, - DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified, - [CanBeNull] string templateName = null) + [CanBeNull] string templateName = null, + DatabaseProvider databaseProvider = DatabaseProvider.NotSpecified, + Dictionary extraProperties = null) { DatabaseProvider = databaseProvider; TemplateName = templateName; SolutionName = Check.NotNull(solutionName, nameof(solutionName)); + + ExtraProperties = extraProperties ?? new Dictionary(); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs index e23e0ebe0e..4540aecbdd 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/TemplateInfoProvider.cs @@ -1,6 +1,7 @@ using System; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Templates; +using Volo.Abp.Cli.ProjectBuilding.Templates.Mvc; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.ProjectBuilding diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/MvcTemplate.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/MvcTemplate.cs similarity index 56% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/MvcTemplate.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/MvcTemplate.cs index 0286a484da..fdc314eddb 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/MvcTemplate.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/MvcTemplate.cs @@ -2,7 +2,7 @@ using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; -namespace Volo.Abp.Cli.ProjectBuilding.Templates +namespace Volo.Abp.Cli.ProjectBuilding.Templates.Mvc { public class MvcTemplate : TemplateInfo { @@ -14,14 +14,17 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates public MvcTemplate() : base(TemplateName, DatabaseProvider.EntityFrameworkCore) { + } public override IEnumerable GetCustomSteps(ProjectBuildContext context) { var steps = new List(); + SwitchDatabaseProvider(context, steps); - RemoveOtherDatabaseProviders(context, steps); + DeleteUnrelatedProjects(context, steps); ChangeLocalhostPort(steps); + return steps; } @@ -31,33 +34,49 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates { steps.Add(new SwitchEntityFrameworkCoreToMongoDbStep()); } - } - private static void RemoveOtherDatabaseProviders(ProjectBuildContext context, List steps) - { if (context.BuildArgs.DatabaseProvider != DatabaseProvider.EntityFrameworkCore) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore")); steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations")); - steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Application.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Application.Tests")); - steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Web.Tests")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests")); } if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb) { steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.MongoDB.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.MongoDB.Tests")); + } + } + + private void DeleteUnrelatedProjects(ProjectBuildContext context, List steps) + { + if (context.BuildArgs.ExtraProperties.ContainsKey("tiered")) + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "test/MyCompanyName.MyProjectName.Web.Tests")); + //TODO: Rename Web.Host to Web + //TODO: Rename HttpApi.Host to HttpApi + } + else + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.HttpApi.Host")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.IdentityServer")); } } private void ChangeLocalhostPort(List steps) { - steps.Add( - new ChangeLocalhostPortStep( - "/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json", - 53929, - 53932 - ) - ); + //Disabled this since port change is complext and should be re-considered later + + //steps.Add( + // new ChangeLocalhostPortStep( + // "/src/MyCompanyName.MyProjectName.Web/Properties/launchSettings.json", + // 53929, + // 53932 + // ) + //); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/SwitchEntityFrameworkCoreToMongoDbStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/SwitchEntityFrameworkCoreToMongoDbStep.cs new file mode 100644 index 0000000000..9efa505437 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Mvc/SwitchEntityFrameworkCoreToMongoDbStep.cs @@ -0,0 +1,173 @@ +using System; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates.Mvc +{ + public class SwitchEntityFrameworkCoreToMongoDbStep : ProjectBuildPipelineStep + { + public override void Execute(ProjectBuildContext context) + { + //MyCompanyName.MyProjectName.Web + + ChangeProjectReference( + context, + "/src/MyCompanyName.MyProjectName.Web/MyCompanyName.MyProjectName.Web.csproj", + "EntityFrameworkCore.DbMigrations", + "MongoDB" + ); + + ChangeModuleDependency( + context, + "/src/MyCompanyName.MyProjectName.Web/MyProjectNameWebModule.cs", + "MyCompanyName.MyProjectName.EntityFrameworkCore", + "MyCompanyName.MyProjectName.MongoDb", + "MyProjectNameEntityFrameworkCoreModule", + "MyProjectNameMongoDbModule" + ); + + ChangeConnectionStringToMongoDb( + context, + "/src/MyCompanyName.MyProjectName.Web/appsettings.json" + ); + + //MyCompanyName.MyProjectName.IdentityServer + + ChangeProjectReference( + context, + "/src/MyCompanyName.MyProjectName.IdentityServer/MyCompanyName.MyProjectName.IdentityServer.csproj", + "EntityFrameworkCore.DbMigrations", + "MongoDB" + ); + + ChangeModuleDependency( + context, + "/src/MyCompanyName.MyProjectName.IdentityServer/MyProjectNameIdentityServerModule.cs", + "MyCompanyName.MyProjectName.EntityFrameworkCore", + "MyCompanyName.MyProjectName.MongoDb", + "MyProjectNameEntityFrameworkCoreModule", + "MyProjectNameMongoDbModule" + ); + + ChangeConnectionStringToMongoDb( + context, + "/src/MyCompanyName.MyProjectName.IdentityServer/appsettings.json" + ); + + //MyCompanyName.MyProjectName.HttpApi.Host + + ChangeProjectReference( + context, + "/src/MyCompanyName.MyProjectName.HttpApi.Host/MyCompanyName.MyProjectName.HttpApi.Host.csproj", + "EntityFrameworkCore.DbMigrations", + "MongoDB" + ); + + ChangeModuleDependency( + context, + "/src/MyCompanyName.MyProjectName.HttpApi.Host/MyProjectNameHttpApiHostModule.cs", + "MyCompanyName.MyProjectName.EntityFrameworkCore", + "MyCompanyName.MyProjectName.MongoDb", + "MyProjectNameEntityFrameworkCoreModule", + "MyProjectNameMongoDbModule" + ); + + ChangeConnectionStringToMongoDb( + context, + "/src/MyCompanyName.MyProjectName.HttpApi.Host/appsettings.json" + ); + + //MyCompanyName.MyProjectName.Domain.Tests + + ChangeProjectReference( + context, + "/test/MyCompanyName.MyProjectName.Domain.Tests/MyCompanyName.MyProjectName.Domain.Tests.csproj", + "EntityFrameworkCore.Tests", + "MongoDB.Tests" + ); + + ChangeModuleDependency( + context, + "/src/MyCompanyName.MyProjectName.Domain.Tests/MyProjectNameDomainTestModule.cs", + "MyCompanyName.MyProjectName.EntityFrameworkCore", + "MyCompanyName.MyProjectName.MongoDb", + "MyProjectNameEntityFrameworkCoreModule", + "MyProjectNameMongoDbModule" + ); + } + + private void ChangeProjectReference( + ProjectBuildContext context, + string targetProjectFilePath, + string oldReference, + string newReference) + { + var file = context.GetFile(targetProjectFilePath); + + file.NormalizeLineEndings(); + + var lines = file.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains("ProjectReference") && lines[i].Contains(oldReference)) + { + lines[i] = lines[i].Replace(oldReference, newReference); + file.SetLines(lines); + return; + } + } + + throw new ApplicationException($"Could not find the '{oldReference}' reference in the project '{targetProjectFilePath}'!"); + } + + private void ChangeModuleDependency( + ProjectBuildContext context, + string targetModuleFilePath, + string oldNamespace, + string newNamespace, + string oldModuleName, + string newModuleName) + { + var file = context.GetFile(targetModuleFilePath); + + file.NormalizeLineEndings(); + + var lines = file.GetLines(); + + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains($"using {oldNamespace};")) + { + lines[i] = $"using {newNamespace};"; + } + else if (lines[i].Contains(oldModuleName)) + { + lines[i] = lines[i].Replace(oldModuleName, newModuleName); + } + } + + file.SetLines(lines); + } + + private void ChangeConnectionStringToMongoDb( + ProjectBuildContext context, + string appsettingFilePath) + { + var file = context.GetFile(appsettingFilePath); + + file.NormalizeLineEndings(); + + var lines = file.GetLines(); + for (var i = 0; i < lines.Length; i++) + { + if (lines[i].Contains("Default") && lines[i].Contains("Database")) + { + lines[i] = " \"Default\": \"mongodb://localhost:27017|MyProjectName\""; + file.SetLines(lines); + return; + } + } + + throw new ApplicationException("Could not find the 'Default' connection string in appsettings.json file!"); + } + } +} \ No newline at end of file