From 6e0c79b36b5a18d3ab2b07bcb663f947ba0db6e3 Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 19 Sep 2023 14:46:30 +0800 Subject: [PATCH 1/4] Check Redis server when creating project. Resolve #17473 --- .../Volo.Abp.Cli.Core.csproj | 1 + .../Volo/Abp/Cli/Commands/NewCommand.cs | 46 +++++++++++++++++++ .../ProjectBuilding/Building/TemplateInfo.cs | 10 +++- .../Templates/App/AppNoLayersTemplateBase.cs | 3 +- .../Templates/App/AppTemplateBase.cs | 2 +- .../Templates/CheckRedisPreRequirements.cs | 16 +++++++ .../MicroserviceServiceTemplateBase.cs | 5 +- .../Microservice/MicroserviceTemplateBase.cs | 3 +- .../Templates/Module/ModuleTemplateBase.cs | 3 +- 9 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj index a6bb742585..ee064c4b67 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj +++ b/framework/src/Volo.Abp.Cli.Core/Volo.Abp.Cli.Core.csproj @@ -23,6 +23,7 @@ + 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 a672b0b563..d53cb06dc3 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 @@ -8,12 +8,14 @@ using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using StackExchange.Redis; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Bundling; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.LIbs; using Volo.Abp.Cli.ProjectBuilding; using Volo.Abp.Cli.ProjectBuilding.Building; +using Volo.Abp.Cli.ProjectBuilding.Templates.App; using Volo.Abp.Cli.ProjectModification; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -89,6 +91,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien var projectArgs = await GetProjectBuildArgsAsync(commandLineArgs, template, projectName); + await CheckCreatingRequirements(projectArgs); + var result = await TemplateProjectBuilder.BuildAsync( projectArgs ); @@ -97,6 +101,8 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien Logger.LogInformation($"'{projectName}' has been successfully created to '{projectArgs.OutputFolder}'"); + await CheckCreatedRequirements(projectArgs); + ConfigureNpmPackagesForTheme(projectArgs); await CreateOpenIddictPfxFilesAsync(projectArgs); await RunGraphBuildForMicroserviceServiceTemplate(projectArgs); @@ -120,6 +126,46 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien OpenRelatedWebPage(projectArgs, template, isTiered, commandLineArgs); } + private Task CheckCreatingRequirements(ProjectBuildArgs projectArgs) + { + return Task.CompletedTask; + } + + private async Task CheckCreatedRequirements(ProjectBuildArgs projectArgs) + { + var errors = new List(); + + if (projectArgs.ExtraProperties.ContainsKey("PreRequirements:Redis")) + { + var isConnected = false; + try + { + var redis = await ConnectionMultiplexer.ConnectAsync("127.0.0.1", options => options.ConnectTimeout = 3000); + isConnected = redis.IsConnected; + } + catch (Exception e) + { + // ignored + } + finally + { + if (!isConnected) + { + errors.Add("\t* Redis is not installed or not running on your computer."); + } + } + } + + if (errors.Any()) + { + Logger.LogWarning("NOTICE: The following tools is required to run your solution."); + foreach (var error in errors) + { + Logger.LogWarning(error); + } + } + } + public string GetUsageInfo() { var sb = new StringBuilder(); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs index 88bdc27973..d33aa103ba 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/TemplateInfo.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using JetBrains.Annotations; +using Volo.Abp.Cli.ProjectBuilding.Templates; namespace Volo.Abp.Cli.ProjectBuilding.Building; @@ -28,7 +29,14 @@ public abstract class TemplateInfo public virtual IEnumerable GetCustomSteps(ProjectBuildContext context) { - return Array.Empty(); + var steps = new List(); + ConfigureCheckPreRequirements(context, steps); + return steps; + } + + protected void ConfigureCheckPreRequirements(ProjectBuildContext context, List steps) + { + steps.Add(new CheckRedisPreRequirements()); } public bool IsPro() 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 ca5f5ceb61..edf8728305 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 @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -20,7 +21,7 @@ public abstract class AppNoLayersTemplateBase : AppTemplateBase public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = base.GetCustomSteps(context).ToList(); switch (context.BuildArgs.DatabaseProvider) { 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 e8522f6f19..89f254e58b 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 @@ -28,7 +28,7 @@ public abstract class AppTemplateBase : TemplateInfo public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = base.GetCustomSteps(context).ToList(); ConfigureTenantSchema(context, steps); SwitchDatabaseProvider(context, steps); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs new file mode 100644 index 0000000000..0d5d35c14a --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs @@ -0,0 +1,16 @@ +using System.Linq; +using Volo.Abp.Cli.ProjectBuilding.Building; + +namespace Volo.Abp.Cli.ProjectBuilding.Templates; + +public class CheckRedisPreRequirements : ProjectBuildPipelineStep +{ + public override void Execute(ProjectBuildContext context) + { + var modules = context.Files.Where(f => f.Name.EndsWith("Module.cs")); + if (modules.Any(module => !module.Content.Contains("Redis:Configuration"))) + { + context.BuildArgs.ExtraProperties["PreRequirements:Redis"] = "true"; + } + } +} diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs index 13674458ee..e5ce4a0f84 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceServiceTemplateBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using JetBrains.Annotations; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -33,14 +34,14 @@ public abstract class MicroserviceServiceTemplateBase : TemplateInfo public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = base.GetCustomSteps(context).ToList(); DeleteUnrelatedUiProject(context, steps); SetRandomPortForHostProject(context, steps); RandomizeStringEncryption(context, steps); RandomizeAuthServerPassPhrase(context, steps); ChangeConnectionString(context, steps); - + return steps; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs index b8d320fb45..cb7722da10 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Microservice/MicroserviceTemplateBase.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -19,7 +20,7 @@ public abstract class MicroserviceTemplateBase : TemplateInfo public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = base.GetCustomSteps(context).ToList(); DeleteUnrelatedProjects(context, steps); RandomizeStringEncryption(context, steps); diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs index 5229bb167f..428c1061a1 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/Module/ModuleTemplateBase.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Linq; using JetBrains.Annotations; using Volo.Abp.Cli.ProjectBuilding.Building; using Volo.Abp.Cli.ProjectBuilding.Building.Steps; @@ -21,7 +22,7 @@ public abstract class ModuleTemplateBase : TemplateInfo public override IEnumerable GetCustomSteps(ProjectBuildContext context) { - var steps = new List(); + var steps = base.GetCustomSteps(context).ToList(); DeleteUnrelatedProjects(context, steps); RandomizeSslPorts(context, steps); From 6945764746cb8f3b3119a196ad4bb663876c2c5c Mon Sep 17 00:00:00 2001 From: maliming Date: Tue, 19 Sep 2023 17:23:58 +0800 Subject: [PATCH 2/4] Update CheckRedisPreRequirements.cs --- .../Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs index 0d5d35c14a..4b31145aba 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using Volo.Abp.Cli.ProjectBuilding.Building; @@ -7,7 +8,7 @@ public class CheckRedisPreRequirements : ProjectBuildPipelineStep { public override void Execute(ProjectBuildContext context) { - var modules = context.Files.Where(f => f.Name.EndsWith("Module.cs")); + var modules = context.Files.Where(f => f.Name.EndsWith("Module.cs", StringComparison.OrdinalIgnoreCase)); if (modules.Any(module => !module.Content.Contains("Redis:Configuration"))) { context.BuildArgs.ExtraProperties["PreRequirements:Redis"] = "true"; From 5fde39243409d9a0f3f6e1833ef9f3206d462894 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Tue, 19 Sep 2023 15:14:49 +0300 Subject: [PATCH 3/4] Update NewCommand.cs --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/NewCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d53cb06dc3..5b00d15c9e 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 @@ -158,7 +158,7 @@ public class NewCommand : ProjectCreationCommandBase, IConsoleCommand, ITransien if (errors.Any()) { - Logger.LogWarning("NOTICE: The following tools is required to run your solution."); + Logger.LogWarning("NOTICE: The following tools are required to run your solution."); foreach (var error in errors) { Logger.LogWarning(error); From dd8c3894bf7fcba2196af6d0a8570f284535251f Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 20 Sep 2023 11:34:50 +0800 Subject: [PATCH 4/4] Update CheckRedisPreRequirements.cs --- .../Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs index 4b31145aba..aee6da8f99 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/CheckRedisPreRequirements.cs @@ -9,7 +9,7 @@ public class CheckRedisPreRequirements : ProjectBuildPipelineStep public override void Execute(ProjectBuildContext context) { var modules = context.Files.Where(f => f.Name.EndsWith("Module.cs", StringComparison.OrdinalIgnoreCase)); - if (modules.Any(module => !module.Content.Contains("Redis:Configuration"))) + if (modules.Any(module => module.Content.Contains("Redis:Configuration"))) { context.BuildArgs.ExtraProperties["PreRequirements:Redis"] = "true"; }