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..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) @@ -22,7 +22,24 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase public override IEnumerable GetCustomSteps(ProjectBuildContext context) { 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) 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(); 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"];