From a08a65e133d767f71a1b8ddec4b6a43c14049168 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 29 Nov 2023 16:44:40 +0800 Subject: [PATCH 1/5] Enhance RemoveUnnecessaryPortsStep --- .../ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs index 2c232bcecf..9bb6a6d95c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/RemoveUnnecessaryPortsStep.cs @@ -73,6 +73,11 @@ public class RemoveUnnecessaryPortsStep : ProjectBuildPipelineStep .FirstOrDefault(f => f.Name.Contains("MyCompanyName.MyProjectName.DbMigrator") && f.Name.EndsWith("appsettings.json")); + if (dbMigratorAppSettings == null) + { + return; + } + var appSettingsJsonObject = JObject.Parse(dbMigratorAppSettings.Content); var authServerJsonObject = (JObject)appSettingsJsonObject?["IdentityServer"] ?? (JObject)appSettingsJsonObject["OpenIddict"]; var clientsJsonObject = (JObject)authServerJsonObject?["Clients"] ?? (JObject)authServerJsonObject?["Applications"]; From 7005076b7d4c52c3230668fc4bf0742c01f55e41 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 29 Nov 2023 17:14:47 +0800 Subject: [PATCH 2/5] Update AppNoLayersTemplateBase.cs --- .../ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs index 9417c46e12..10288b6d89 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs @@ -21,7 +21,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = base.GetCustomSteps(context).ToList(); + var steps = new List(); switch (context.BuildArgs.DatabaseProvider) { From 0263db8543dd3ab9f848ac9808a519e2af123f31 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 29 Nov 2023 17:24:24 +0800 Subject: [PATCH 3/5] Update BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs --- ...orAppsettingsFilePortChangeForSeparatedAuthServersStep.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs index 8c96082a60..b78f61ccd0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep.cs @@ -14,6 +14,11 @@ public class BlazorAppsettingsFilePortChangeForSeparatedAuthServersStep : Projec StringComparison.InvariantCultureIgnoreCase) ); + if (appsettingsFile == null) + { + return; + } + appsettingsFile.NormalizeLineEndings(); var lines = appsettingsFile.GetLines(); From c8aa10042a9ab1940123c2e434c660f1e6de3bf1 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 29 Nov 2023 17:27:56 +0800 Subject: [PATCH 4/5] Add CheckRedisPreRequirements --- .../ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs index 10288b6d89..0210d1a8b0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs @@ -21,7 +21,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = new List { new CheckRedisPreRequirements() }; switch (context.BuildArgs.DatabaseProvider) { From 7fe189dd355ac07cabe4ead2bc74642ee42b5637 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 29 Nov 2023 18:31:03 +0800 Subject: [PATCH 5/5] Enhance AppNoLayersTemplateBase --- .../Templates/App/AppNoLayersTemplateBase.cs | 248 ++++++++++++++++-- .../Templates/App/AppTemplateBase.cs | 15 +- 2 files changed, 230 insertions(+), 33 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs index 0210d1a8b0..7bbba5c733 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppNoLayersTemplateBase.cs @@ -5,7 +5,7 @@ using Volo.Abp.Cli.ProjectBuilding.Building.Steps; namespace Volo.Abp.Cli.ProjectBuilding.Templates.App; -public abstract class AppNoLayersTemplateBase : AppTemplateBase +public abstract class AppNoLayersTemplateBase : TemplateInfo { protected AppNoLayersTemplateBase(string templateName) : base(templateName) @@ -21,8 +21,25 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List { new CheckRedisPreRequirements() }; + var steps = base.GetCustomSteps(context).ToList(); + + SwitchDatabaseProvider(context, steps); + DeleteUnrelatedProjects(context, steps); + RemoveMigrations(context, steps); + RandomizeSslPorts(context, steps); + RandomizeStringEncryption(context, steps); + RandomizeAuthServerPassPhrase(context, steps); + UpdateNuGetConfig(context, steps); + ChangeConnectionString(context, steps); + ConfigureDockerFiles(context, steps); + ConfigureTheme(context, steps); + CleanupFolderHierarchy(context, steps); + return steps; + } + + protected void SwitchDatabaseProvider(ProjectBuildContext context, List steps) + { switch (context.BuildArgs.DatabaseProvider) { case DatabaseProvider.NotSpecified: @@ -49,7 +66,10 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase } context.Symbols.Add($"dbms:{context.BuildArgs.DatabaseManagementSystem}"); + } + protected void DeleteUnrelatedProjects(ProjectBuildContext context, List steps) + { switch (context.BuildArgs.UiFramework) { case UiFramework.Angular: @@ -109,34 +129,47 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase default: throw new AbpException("Unkown UI framework: " + context.BuildArgs.UiFramework); } + } + + protected void RandomizeSslPorts(ProjectBuildContext context, List steps) + { + if (context.BuildArgs.ExtraProperties.ContainsKey("no-random-port")) + { + return; + } - steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName/Migrations")); - steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations")); - RandomizeSslPorts(context, steps); - RandomizeStringEncryption(context, steps); - RandomizeAuthServerPassPhrase(context, steps); - UpdateNuGetConfig(context, steps); - ChangeConnectionString(context, steps); - ConfigureDockerFiles(context, steps); - ConfigureTheme(context, steps); - + //todo: discuss blazor ports + steps.Add(new TemplateRandomSslPortStep( + new List + { + "https://localhost:44300", + "https://localhost:44301", + "https://localhost:44302", + "https://localhost:44303", + "https://localhost:44304", + "https://localhost:44305", + "https://localhost:44306", + "https://localhost:44307", + "https://localhost:44308", + "https://localhost:44309", + "https://localhost:44310" + } + ) + ); + } + + protected void CleanupFolderHierarchy(ProjectBuildContext context, List steps) + { if (context.BuildArgs.UiFramework != UiFramework.Angular) { steps.Add(new MoveFolderStep("/aspnet-core/", "/")); } - - return steps; } - - private static void RemoveBlazorWasmProjects(List steps) + + protected void RemoveMigrations(ProjectBuildContext context, List steps) { - steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Server", - projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server")); - steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Client", - projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client")); - steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared", - projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared")); - steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly")); + steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName/Migrations")); + steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Host/Migrations")); } protected void ConfigureDockerFiles(ProjectBuildContext context, List steps) @@ -169,4 +202,173 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase break; } } + + protected void RandomizeStringEncryption(ProjectBuildContext context, List steps) + { + steps.Add(new RandomizeStringEncryptionStep()); + } + + protected static void RandomizeAuthServerPassPhrase(ProjectBuildContext context, List steps) + { + steps.Add(new RandomizeAuthServerPassPhraseStep()); + } + + protected void UpdateNuGetConfig(ProjectBuildContext context, List steps) + { + steps.Add(new UpdateNuGetConfigStep("/aspnet-core/NuGet.Config")); + } + + protected void ChangeConnectionString(ProjectBuildContext context, List steps) + { + if (context.BuildArgs.ConnectionString != null) + { + steps.Add(new ConnectionStringChangeStep()); + } + + if (IsPro()) + { + steps.Add(new ConnectionStringRenameStep()); + } + } + + protected void ConfigureTheme(ProjectBuildContext context, List steps) + { + if (!context.BuildArgs.Theme.HasValue) + { + return; + } + + if (context.BuildArgs.Theme != Theme.NotSpecified) + { + context.Symbols.Add(context.BuildArgs.Theme.Value.ToString().ToUpper()); + } + + if (context.BuildArgs.Theme == Theme.LeptonX) + { + steps.Add(new ChangeThemeStyleStep()); + } + + RemoveThemeLogoFolders(context, steps); + + if (IsDefaultThemeForTemplate(context.BuildArgs)) + { + return; + } + + steps.Add(new ChangeThemeStep()); + RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); + } + + private static void RemoveBlazorWasmProjects(List steps) + { + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Server", + projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Server")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Client", + projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Client")); + steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor.WebAssembly.Shared", + projectFolderPath: "/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly/Shared")); + steps.Add(new RemoveFolderStep("/aspnet-core/MyCompanyName.MyProjectName.Blazor.WebAssembly")); + } + + private void RemoveThemeLogoFolders(ProjectBuildContext context, List steps) + { + if (context.BuildArgs.Theme != Theme.Lepton && IsPro()) + { + steps.Add(new RemoveFilesStep("/wwwroot/images/logo/lepton/")); + } + + if (context.BuildArgs.Theme != Theme.LeptonX && context.BuildArgs.Theme != Theme.LeptonXLite) + { + steps.Add(new RemoveFilesStep("/wwwroot/images/logo/leptonx/")); + } + } + + protected void SetDbmsSymbols(ProjectBuildContext context) + { + switch (context.BuildArgs.DatabaseManagementSystem) + { + case DatabaseManagementSystem.NotSpecified: + context.Symbols.Add("SqlServer"); + break; + case DatabaseManagementSystem.SQLServer: + context.Symbols.Add("SqlServer"); + break; + case DatabaseManagementSystem.MySQL: + context.Symbols.Add("MySql"); + break; + case DatabaseManagementSystem.PostgreSQL: + context.Symbols.Add("PostgreSql"); + break; + case DatabaseManagementSystem.Oracle: + context.Symbols.Add("Oracle"); + break; + case DatabaseManagementSystem.OracleDevart: + context.Symbols.Add("Oracle"); + break; + case DatabaseManagementSystem.SQLite: + context.Symbols.Add("SqLite"); + break; + default: + throw new AbpException("Unknown Dbms: " + context.BuildArgs.DatabaseManagementSystem); + } + } + + private static bool IsDefaultThemeForTemplate(ProjectBuildArgs args) + { + var templateThemes = new Dictionary + { + { AppNoLayersTemplate.TemplateName, AppNoLayersTemplate.DefaultTheme }, + { AppNoLayersProTemplate.TemplateName, AppNoLayersProTemplate.DefaultTheme } + }; + + return templateThemes.TryGetValue(args.TemplateName!, out var templateTheme) && templateTheme == args.Theme; + } + + private static void RemoveLeptonXThemePackagesFromPackageJsonFiles(List steps, bool isProTemplate, UiFramework uiFramework) + { + var mvcUiPackageName = isProTemplate ? "@volo/abp.aspnetcore.mvc.ui.theme.leptonx" : "@abp/aspnetcore.mvc.ui.theme.leptonxlite"; + var packageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Web/package.json", + "/MyCompanyName.MyProjectName.Web.Host/package.json", + "/MyCompanyName.MyProjectName/package.json", + "/MyCompanyName.MyProjectName.Host/package.json", + "/MyCompanyName.MyProjectName.Host.Mongo/package.json" + }; + + foreach (var packageJsonFilePath in packageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(packageJsonFilePath, mvcUiPackageName)); + } + + if (uiFramework == UiFramework.BlazorServer) + { + var blazorServerUiPackageName = isProTemplate ? "@volo/aspnetcore.components.server.leptonxtheme" : "@abp/aspnetcore.components.server.leptonxlitetheme"; + var blazorServerPackageJsonFilePaths = new List + { + "/MyCompanyName.MyProjectName.Blazor/package.json", + "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" + }; + + foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, mvcUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(blazorServerPackageJsonFilePath, blazorServerUiPackageName)); + } + } + else if (uiFramework == UiFramework.Angular) + { + var ngUiPackageName = isProTemplate ? "@volosoft/abp.ng.theme.lepton-x" : "@abp/ng.theme.lepton-x"; + var angularPackageJsonFilePaths = new List + { + "/angular/package.json" + }; + + foreach (var angularPackageJsonFilePath in angularPackageJsonFilePaths) + { + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, ngUiPackageName)); + steps.Add(new RemoveDependencyFromPackageJsonFileStep(angularPackageJsonFilePath, "bootstrap-icons")); + } + } + } } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs index 0fecd09eb4..90eceabb73 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs @@ -235,7 +235,7 @@ public abstract class AppTemplateBase : TemplateInfo steps.Add(new ChangeThemeStep()); RemoveLeptonXThemePackagesFromPackageJsonFiles(steps, isProTemplate: IsPro(), uiFramework: context.BuildArgs.UiFramework); } - + protected void SetDbmsSymbols(ProjectBuildContext context) { switch (context.BuildArgs.DatabaseManagementSystem) @@ -265,7 +265,7 @@ public abstract class AppTemplateBase : TemplateInfo throw new AbpException("Unknown Dbms: " + context.BuildArgs.DatabaseManagementSystem); } } - + private void RemoveThemeLogoFolders(ProjectBuildContext context, List steps) { if (context.BuildArgs.Theme != Theme.Lepton && IsPro()) @@ -284,9 +284,7 @@ public abstract class AppTemplateBase : TemplateInfo var templateThemes = new Dictionary { { AppTemplate.TemplateName, AppTemplate.DefaultTheme }, - { AppProTemplate.TemplateName, AppProTemplate.DefaultTheme }, - { AppNoLayersTemplate.TemplateName, AppNoLayersTemplate.DefaultTheme }, - { AppNoLayersProTemplate.TemplateName, AppNoLayersProTemplate.DefaultTheme } + { AppProTemplate.TemplateName, AppProTemplate.DefaultTheme } }; return templateThemes.TryGetValue(args.TemplateName!, out var templateTheme) && templateTheme == args.Theme; @@ -304,9 +302,7 @@ public abstract class AppTemplateBase : TemplateInfo "/MyCompanyName.MyProjectName.HttpApi.HostWithIds/package.json", "/MyCompanyName.MyProjectName.HttpApi.Host/package.json", "/MyCompanyName.MyProjectName.AuthServer/package.json", - "/MyCompanyName.MyProjectName/package.json", - "/MyCompanyName.MyProjectName.Host/package.json", - "/MyCompanyName.MyProjectName.Host.Mongo/package.json" + "/MyCompanyName.MyProjectName/package.json" }; foreach (var packageJsonFilePath in packageJsonFilePaths) @@ -320,8 +316,7 @@ public abstract class AppTemplateBase : TemplateInfo var blazorServerPackageJsonFilePaths = new List { "/MyCompanyName.MyProjectName.Blazor/package.json", - "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json", - "/MyCompanyName.MyProjectName.Blazor.Server.Mongo/package.json" + "/MyCompanyName.MyProjectName.Blazor.Server.Tiered/package.json" }; foreach (var blazorServerPackageJsonFilePath in blazorServerPackageJsonFilePaths)