From 7d15a0e4d5db38465f7345eb5734ae05050696ee Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Thu, 5 Jun 2025 17:56:42 +0800 Subject: [PATCH 1/9] Add template path configuration --- .../Commands/CommandOptionsBase.cs | 16 ++++++++++++++++ .../Generate/Controller/ControllerCommand.cs | 2 +- .../Commands/Generate/Crud/CrudCommand.cs | 2 +- .../Generate/Localization/LocalizationCommand.cs | 2 +- .../Commands/Generate/Methods/MethodsCommand.cs | 2 +- .../Commands/Generate/Service/ServiceCommand.cs | 2 +- .../Commands/Module/Add/AddCommand.cs | 2 +- .../Commands/Module/Remove/RemoveCommand.cs | 2 +- .../Extensions/FileProviderExtensions.cs | 10 +++++++--- src/AbpHelper.Core/Generator/TextGenerator.cs | 16 +++++++++++++--- 10 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index 89d89233..73ea7e4a 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using EasyAbp.AbpHelper.Core.Attributes; namespace EasyAbp.AbpHelper.Core.Commands @@ -14,5 +15,20 @@ public abstract class CommandOptionsBase [Option("exclude", Description = "Exclude directories when searching files, arguments can contain a combination of valid literal path and wildcard (* and ?) characters. Use double asterisk(**) to search all directories. Example: --exclude *Folder1 Folder2/Folder* **/*Folder? **/*Folder*")] public virtual string[] Exclude { get; set; } = Array.Empty(); + + [Option('t', "template-path", Description = "Prioritize loading template files in the path")] + public string? TemplatePath { set { _templatePath = value; } } + + private string? _templatePath = string.Empty; + + public string GetTemplatePath(string subPath) + { + if (_templatePath.IsNullOrWhiteSpace()) + { + return Path.Combine(new[] { "/Templates", subPath }); + } + + return Path.Combine(_templatePath!, subPath); + } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs b/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs index e23f5776..2f3d2f67 100644 --- a/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs @@ -33,7 +33,7 @@ protected override IActivityBuilder ConfigureBuild(ControllerCommandOption optio step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Controller"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Controller")); }) .Then( step => step.ConditionExpression = new JavaScriptExpression($"{OptionVariableName}.{nameof(ControllerCommandOption.SkipBuild)}"), diff --git a/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs b/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs index 68025ec8..63d90aca 100644 --- a/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs @@ -35,7 +35,7 @@ protected override IActivityBuilder ConfigureBuild(CrudCommandOption option, IAc step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Crud"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Crud")); }) .Then( step => { step.SearchFileName = new LiteralExpression(entityFileName); }) diff --git a/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs b/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs index 8f922dd8..aa5eac7b 100644 --- a/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs @@ -28,7 +28,7 @@ protected override IActivityBuilder ConfigureBuild(LocalizationCommandOption opt step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Localization"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Localization")); }) .Then() /* Add localization */ diff --git a/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs b/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs index a732424c..c21a74a3 100644 --- a/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs @@ -44,7 +44,7 @@ protected override IActivityBuilder ConfigureBuild(MethodsCommandOption option, step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Methods"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Methods")); }) .Then( step => diff --git a/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs b/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs index 4b1da57b..c39e09d1 100644 --- a/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs @@ -38,7 +38,7 @@ protected override IActivityBuilder ConfigureBuild(ServiceCommandOption option, step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Service"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Service")); }) .Then() .Then( diff --git a/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs b/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs index a18d09e8..059b567d 100644 --- a/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs +++ b/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs @@ -74,7 +74,7 @@ protected override IActivityBuilder ConfigureBuild(AddCommandOption option, IAct step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Module"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Module")); }) .Then( step => diff --git a/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs b/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs index eba30193..06ba9b03 100644 --- a/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs +++ b/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs @@ -69,7 +69,7 @@ protected override IActivityBuilder ConfigureBuild(RemoveCommandOption option, I step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression("/Templates/Module"); + step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Module")); }) .Then( step => diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index 0dbd759e..fb0b7433 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -1,6 +1,7 @@ -using System; +using Microsoft.Extensions.FileProviders; +using System; using System.Collections.Generic; -using Microsoft.Extensions.FileProviders; +using System.IO; namespace EasyAbp.AbpHelper.Core.Extensions { @@ -9,7 +10,10 @@ public static class FileProviderExtensions public static IEnumerable<(string, IFileInfo)> GetFilesRecursively(this IFileProvider fileProvider, string subpath) { subpath = subpath.EnsureEndsWith('/'); - var contents = fileProvider.GetDirectoryContents(subpath); + + var contents = Directory.Exists(subpath) ? + new PhysicalFileProvider(subpath).GetDirectoryContents("") : fileProvider.GetDirectoryContents(subpath); + foreach (var content in contents) { if (content.IsDirectory) diff --git a/src/AbpHelper.Core/Generator/TextGenerator.cs b/src/AbpHelper.Core/Generator/TextGenerator.cs index 68ad925c..3424d5d8 100644 --- a/src/AbpHelper.Core/Generator/TextGenerator.cs +++ b/src/AbpHelper.Core/Generator/TextGenerator.cs @@ -26,12 +26,22 @@ public string GenerateByTemplateName(string templateDirectory, string templateNa { return GenerateByTemplateName(templateDirectory, templateName, model, out _); } - + public string GenerateByTemplateName(string templateDirectory, string templateName, object model, out TemplateContext context) { string path = Path.Combine(templateDirectory, templateName).NormalizePath(); - var templateFile = _virtualFileProvider.GetFileInfo(path); - var templateText = templateFile.ReadAsString(); + + var templateText = ""; + + if (Directory.Exists(templateDirectory)) + { + templateText = File.ReadAllText(path); + } + else + { + var templateFile = _virtualFileProvider.GetFileInfo(path); + templateText = templateFile.ReadAsString(); + } return GenerateByTemplateText(templateText, model, out context); } From e81338dc400a4ee469e6589a8bbb499a95ed957c Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Thu, 5 Jun 2025 18:32:54 +0800 Subject: [PATCH 2/9] TextGenerator Optimize --- src/AbpHelper.Core/Generator/TextGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AbpHelper.Core/Generator/TextGenerator.cs b/src/AbpHelper.Core/Generator/TextGenerator.cs index 3424d5d8..965f98ce 100644 --- a/src/AbpHelper.Core/Generator/TextGenerator.cs +++ b/src/AbpHelper.Core/Generator/TextGenerator.cs @@ -33,7 +33,7 @@ public string GenerateByTemplateName(string templateDirectory, string templateNa var templateText = ""; - if (Directory.Exists(templateDirectory)) + if (File.Exists(path)) { templateText = File.ReadAllText(path); } From 9199bff580fd749bcb2de9f008b9661bd8123440 Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Thu, 5 Jun 2025 22:37:45 +0800 Subject: [PATCH 3/9] Modify CommandOptionsBase method name --- src/AbpHelper.Core/Commands/CommandOptionsBase.cs | 13 ++++++------- .../Generate/Controller/ControllerCommand.cs | 2 +- .../Commands/Generate/Crud/CrudCommand.cs | 2 +- .../Generate/Localization/LocalizationCommand.cs | 2 +- .../Commands/Generate/Methods/MethodsCommand.cs | 2 +- .../Commands/Generate/Service/ServiceCommand.cs | 2 +- .../Commands/Module/Add/AddCommand.cs | 2 +- .../Commands/Module/Remove/RemoveCommand.cs | 2 +- 8 files changed, 13 insertions(+), 14 deletions(-) diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index 73ea7e4a..1b71f5bd 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -1,6 +1,7 @@ using System; using System.IO; using EasyAbp.AbpHelper.Core.Attributes; +using EasyAbp.AbpHelper.Core.Extensions; namespace EasyAbp.AbpHelper.Core.Commands { @@ -17,18 +18,16 @@ public abstract class CommandOptionsBase public virtual string[] Exclude { get; set; } = Array.Empty(); [Option('t', "template-path", Description = "Prioritize loading template files in the path")] - public string? TemplatePath { set { _templatePath = value; } } + public virtual string? TemplatePath { get; set; } - private string? _templatePath = string.Empty; - - public string GetTemplatePath(string subPath) + public virtual string MapTemplatePath(string subPath) { - if (_templatePath.IsNullOrWhiteSpace()) + if (TemplatePath.IsNullOrWhiteSpace()) { - return Path.Combine(new[] { "/Templates", subPath }); + return Path.Combine(new[] { "/Templates", subPath }).NormalizePath(); } - return Path.Combine(_templatePath!, subPath); + return Path.Combine(TemplatePath!, subPath).NormalizePath(); } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs b/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs index 2f3d2f67..541f6386 100644 --- a/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Controller/ControllerCommand.cs @@ -33,7 +33,7 @@ protected override IActivityBuilder ConfigureBuild(ControllerCommandOption optio step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Controller")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Controller")); }) .Then( step => step.ConditionExpression = new JavaScriptExpression($"{OptionVariableName}.{nameof(ControllerCommandOption.SkipBuild)}"), diff --git a/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs b/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs index 63d90aca..2a26d1d8 100644 --- a/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Crud/CrudCommand.cs @@ -35,7 +35,7 @@ protected override IActivityBuilder ConfigureBuild(CrudCommandOption option, IAc step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Crud")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Crud")); }) .Then( step => { step.SearchFileName = new LiteralExpression(entityFileName); }) diff --git a/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs b/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs index aa5eac7b..7f17cef5 100644 --- a/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Localization/LocalizationCommand.cs @@ -28,7 +28,7 @@ protected override IActivityBuilder ConfigureBuild(LocalizationCommandOption opt step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Localization")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Localization")); }) .Then() /* Add localization */ diff --git a/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs b/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs index c21a74a3..5c3824ac 100644 --- a/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Methods/MethodsCommand.cs @@ -44,7 +44,7 @@ protected override IActivityBuilder ConfigureBuild(MethodsCommandOption option, step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Methods")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Methods")); }) .Then( step => diff --git a/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs b/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs index c39e09d1..f4f6d5fe 100644 --- a/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs +++ b/src/AbpHelper.Core/Commands/Generate/Service/ServiceCommand.cs @@ -38,7 +38,7 @@ protected override IActivityBuilder ConfigureBuild(ServiceCommandOption option, step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Service")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Service")); }) .Then() .Then( diff --git a/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs b/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs index 059b567d..1a0d31fa 100644 --- a/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs +++ b/src/AbpHelper.Core/Commands/Module/Add/AddCommand.cs @@ -74,7 +74,7 @@ protected override IActivityBuilder ConfigureBuild(AddCommandOption option, IAct step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Module")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Module")); }) .Then( step => diff --git a/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs b/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs index 06ba9b03..bee54364 100644 --- a/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs +++ b/src/AbpHelper.Core/Commands/Module/Remove/RemoveCommand.cs @@ -69,7 +69,7 @@ protected override IActivityBuilder ConfigureBuild(RemoveCommandOption option, I step => { step.VariableName = VariableNames.TemplateDirectory; - step.ValueExpression = new LiteralExpression(option.GetTemplatePath("Module")); + step.ValueExpression = new LiteralExpression(option.MapTemplatePath("Module")); }) .Then( step => From bcc98454fc63843dd910ef9ebc02cbe2809f4a3a Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Thu, 5 Jun 2025 22:49:12 +0800 Subject: [PATCH 4/9] TemplateLoader update --- src/AbpHelper.Core/Generator/TemplateLoader.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/AbpHelper.Core/Generator/TemplateLoader.cs b/src/AbpHelper.Core/Generator/TemplateLoader.cs index 04eda51a..2d7010c1 100644 --- a/src/AbpHelper.Core/Generator/TemplateLoader.cs +++ b/src/AbpHelper.Core/Generator/TemplateLoader.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.IO; +using System.Threading.Tasks; using Microsoft.Extensions.FileProviders; using Scriban; using Scriban.Parsing; @@ -24,11 +25,21 @@ public string GetPath(TemplateContext context, SourceSpan callerSpan, string tem public string Load(TemplateContext context, SourceSpan callerSpan, string templatePath) { + if (File.Exists(templatePath)) + { + return File.ReadAllText(templatePath); + } + return _virtualFileProvider.GetFileInfo(templatePath).ReadAsString(); } public async ValueTask LoadAsync(TemplateContext context, SourceSpan callerSpan, string templatePath) { + if (File.Exists(templatePath)) + { + return await File.ReadAllTextAsync(templatePath); + } + return await _virtualFileProvider.GetFileInfo(templatePath).ReadAsStringAsync(); } } From 621adb528b0f61a249081be51d09ceefc6d3476c Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Fri, 18 Jul 2025 20:03:47 +0800 Subject: [PATCH 5/9] Optimize path search --- .../Commands/CommandOptionsBase.cs | 2 +- .../Extensions/FileProviderExtensions.cs | 69 +++++++++++++++++-- .../Generator/TemplateLoader.cs | 17 +++-- src/AbpHelper.Core/Generator/TextGenerator.cs | 4 +- .../Steps/Common/GroupGenerationStep.cs | 6 +- 5 files changed, 83 insertions(+), 15 deletions(-) diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index 1b71f5bd..1eaa511a 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -27,7 +27,7 @@ public virtual string MapTemplatePath(string subPath) return Path.Combine(new[] { "/Templates", subPath }).NormalizePath(); } - return Path.Combine(TemplatePath!, subPath).NormalizePath(); + return Path.Combine(new[] { TemplatePath!, "Templates", subPath }).NormalizePath(); } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index fb0b7433..7b6ffd14 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -1,7 +1,8 @@ -using Microsoft.Extensions.FileProviders; -using System; +using System; using System.Collections.Generic; -using System.IO; +using Microsoft.Extensions.FileProviders; +using System.Linq; +using Volo.Abp.VirtualFileSystem; namespace EasyAbp.AbpHelper.Core.Extensions { @@ -11,8 +12,7 @@ public static class FileProviderExtensions { subpath = subpath.EnsureEndsWith('/'); - var contents = Directory.Exists(subpath) ? - new PhysicalFileProvider(subpath).GetDirectoryContents("") : fileProvider.GetDirectoryContents(subpath); + var contents = fileProvider.GetDirectoryContents(subpath); foreach (var content in contents) { @@ -30,5 +30,64 @@ public static class FileProviderExtensions } } } + + public static IEnumerable<(string, IFileInfo)> GetFilesRecursively(this IVirtualFileProvider fileProvider, string dir) + { + var (virtualDirectory, physicalDirectory) = TemplateRootDirectoryMirror(dir); + + var files = GetFilesRecursively((IFileProvider)fileProvider, virtualDirectory); + + if (physicalDirectory == null) + { + return files; + } + + var physicalFiles = new PhysicalFileProvider(physicalDirectory).GetFilesRecursively("").ToList(); + var virtualFiles = files.ToList(); + + return physicalFiles.Concat(virtualFiles.Where(v => !physicalFiles.Any(p => p.Item1 == v.Item1))); + } + + private static readonly string virtualDirectoryPrefix = "/Templates/"; + + /// + /// If is physical path try to get virtual directory path + /// + /// + /// (virtualDirectory, physicalDirectory) + public static (string, string?) GetTemplateRootDirectoryMirror(this IVirtualFileProvider fileProvider, string dir) + => TemplateRootDirectoryMirror(dir); + + private static (string, string?) TemplateRootDirectoryMirror(string dir) + { + if (dir.StartsWith(virtualDirectoryPrefix)) + { + return (dir, null); + } + + var index = dir.IndexOf(virtualDirectoryPrefix); + var virtualDirectory = dir.Substring(index); + var physicalDirectory = dir.Substring(0, index); + + return (virtualDirectory, physicalDirectory); + } + + /// + /// If is physical path try to get virtual directory path + /// + /// + /// (virtualDirectory, physicalDirectory) + public static (string, string?) GetTemplatePathMirror(this IVirtualFileProvider fileProvider, string dir) + { + if (dir.StartsWith(virtualDirectoryPrefix)) + { + return (dir, null); + } + + var index = dir.IndexOf(virtualDirectoryPrefix); + var virtualPath = dir.Substring(index); + + return (virtualPath, dir); + } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Generator/TemplateLoader.cs b/src/AbpHelper.Core/Generator/TemplateLoader.cs index 2d7010c1..2e151799 100644 --- a/src/AbpHelper.Core/Generator/TemplateLoader.cs +++ b/src/AbpHelper.Core/Generator/TemplateLoader.cs @@ -1,5 +1,6 @@ using System.IO; using System.Threading.Tasks; +using EasyAbp.AbpHelper.Core.Extensions; using Microsoft.Extensions.FileProviders; using Scriban; using Scriban.Parsing; @@ -25,22 +26,26 @@ public string GetPath(TemplateContext context, SourceSpan callerSpan, string tem public string Load(TemplateContext context, SourceSpan callerSpan, string templatePath) { - if (File.Exists(templatePath)) + var (v, p) = _virtualFileProvider.GetTemplatePathMirror(templatePath); + + if (p != null && File.Exists(p)) { - return File.ReadAllText(templatePath); + return File.ReadAllText(p); } - return _virtualFileProvider.GetFileInfo(templatePath).ReadAsString(); + return _virtualFileProvider.GetFileInfo(v).ReadAsString(); } public async ValueTask LoadAsync(TemplateContext context, SourceSpan callerSpan, string templatePath) { - if (File.Exists(templatePath)) + var (v, p) = _virtualFileProvider.GetTemplatePathMirror(templatePath); + + if (p != null && File.Exists(p)) { - return await File.ReadAllTextAsync(templatePath); + return await File.ReadAllTextAsync(p); } - return await _virtualFileProvider.GetFileInfo(templatePath).ReadAsStringAsync(); + return await _virtualFileProvider.GetFileInfo(v).ReadAsStringAsync(); } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Generator/TextGenerator.cs b/src/AbpHelper.Core/Generator/TextGenerator.cs index 965f98ce..e12dfff0 100644 --- a/src/AbpHelper.Core/Generator/TextGenerator.cs +++ b/src/AbpHelper.Core/Generator/TextGenerator.cs @@ -39,7 +39,9 @@ public string GenerateByTemplateName(string templateDirectory, string templateNa } else { - var templateFile = _virtualFileProvider.GetFileInfo(path); + var (virtualPath, physicalDirectory) = _virtualFileProvider.GetTemplateRootDirectoryMirror(path); + + var templateFile = _virtualFileProvider.GetFileInfo(virtualPath); templateText = templateFile.ReadAsString(); } return GenerateByTemplateText(templateText, model, out context); diff --git a/src/AbpHelper.Core/Steps/Common/GroupGenerationStep.cs b/src/AbpHelper.Core/Steps/Common/GroupGenerationStep.cs index 60d764a7..e3b2c640 100644 --- a/src/AbpHelper.Core/Steps/Common/GroupGenerationStep.cs +++ b/src/AbpHelper.Core/Steps/Common/GroupGenerationStep.cs @@ -27,7 +27,7 @@ public WorkflowExpression TemplateDirectory get => GetState>(() => new JavaScriptExpression(VariableNames.TemplateDirectory)); set => SetState(value); } - + public string GroupName { get => GetState(); @@ -80,10 +80,12 @@ protected override async Task OnExecuteAsync(WorkflowEx private async Task GenerateFile(string groupDirectory, string targetDirectory, object model, bool overwrite) { + var (virtualDirectory, physicalDirectory) = _virtualFileProvider.GetTemplateRootDirectoryMirror(groupDirectory); + foreach (var (path, file) in _virtualFileProvider.GetFilesRecursively(groupDirectory)) { Logger.LogDebug($"Generating using template file: {path}"); - var targetFilePathNameTemplate = path.Replace(groupDirectory, targetDirectory); + var targetFilePathNameTemplate = path.Replace(virtualDirectory, targetDirectory); var targetFilePathName = _textGenerator.GenerateByTemplateText(targetFilePathNameTemplate, model); if (File.Exists(targetFilePathName) && !overwrite) { From 20c25a95555b72c2ff55d55d91250d87935949f6 Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Fri, 18 Jul 2025 20:20:56 +0800 Subject: [PATCH 6/9] Remove unnecessary line breaks --- src/AbpHelper.Core/Extensions/FileProviderExtensions.cs | 7 ------- src/AbpHelper.Core/Generator/TemplateLoader.cs | 4 ---- src/AbpHelper.Core/Generator/TextGenerator.cs | 4 +--- 3 files changed, 1 insertion(+), 14 deletions(-) diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index 7b6ffd14..0181dbea 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -11,9 +11,7 @@ public static class FileProviderExtensions public static IEnumerable<(string, IFileInfo)> GetFilesRecursively(this IFileProvider fileProvider, string subpath) { subpath = subpath.EnsureEndsWith('/'); - var contents = fileProvider.GetDirectoryContents(subpath); - foreach (var content in contents) { if (content.IsDirectory) @@ -34,14 +32,11 @@ public static class FileProviderExtensions public static IEnumerable<(string, IFileInfo)> GetFilesRecursively(this IVirtualFileProvider fileProvider, string dir) { var (virtualDirectory, physicalDirectory) = TemplateRootDirectoryMirror(dir); - var files = GetFilesRecursively((IFileProvider)fileProvider, virtualDirectory); - if (physicalDirectory == null) { return files; } - var physicalFiles = new PhysicalFileProvider(physicalDirectory).GetFilesRecursively("").ToList(); var virtualFiles = files.ToList(); @@ -64,7 +59,6 @@ private static (string, string?) TemplateRootDirectoryMirror(string dir) { return (dir, null); } - var index = dir.IndexOf(virtualDirectoryPrefix); var virtualDirectory = dir.Substring(index); var physicalDirectory = dir.Substring(0, index); @@ -83,7 +77,6 @@ public static (string, string?) GetTemplatePathMirror(this IVirtualFileProvider { return (dir, null); } - var index = dir.IndexOf(virtualDirectoryPrefix); var virtualPath = dir.Substring(index); diff --git a/src/AbpHelper.Core/Generator/TemplateLoader.cs b/src/AbpHelper.Core/Generator/TemplateLoader.cs index 2e151799..3a498554 100644 --- a/src/AbpHelper.Core/Generator/TemplateLoader.cs +++ b/src/AbpHelper.Core/Generator/TemplateLoader.cs @@ -27,24 +27,20 @@ public string GetPath(TemplateContext context, SourceSpan callerSpan, string tem public string Load(TemplateContext context, SourceSpan callerSpan, string templatePath) { var (v, p) = _virtualFileProvider.GetTemplatePathMirror(templatePath); - if (p != null && File.Exists(p)) { return File.ReadAllText(p); } - return _virtualFileProvider.GetFileInfo(v).ReadAsString(); } public async ValueTask LoadAsync(TemplateContext context, SourceSpan callerSpan, string templatePath) { var (v, p) = _virtualFileProvider.GetTemplatePathMirror(templatePath); - if (p != null && File.Exists(p)) { return await File.ReadAllTextAsync(p); } - return await _virtualFileProvider.GetFileInfo(v).ReadAsStringAsync(); } } diff --git a/src/AbpHelper.Core/Generator/TextGenerator.cs b/src/AbpHelper.Core/Generator/TextGenerator.cs index e12dfff0..fe7e53f2 100644 --- a/src/AbpHelper.Core/Generator/TextGenerator.cs +++ b/src/AbpHelper.Core/Generator/TextGenerator.cs @@ -30,16 +30,14 @@ public string GenerateByTemplateName(string templateDirectory, string templateNa public string GenerateByTemplateName(string templateDirectory, string templateName, object model, out TemplateContext context) { string path = Path.Combine(templateDirectory, templateName).NormalizePath(); - var templateText = ""; - if (File.Exists(path)) { templateText = File.ReadAllText(path); } else { - var (virtualPath, physicalDirectory) = _virtualFileProvider.GetTemplateRootDirectoryMirror(path); + var (virtualPath, _) = _virtualFileProvider.GetTemplateRootDirectoryMirror(path); var templateFile = _virtualFileProvider.GetFileInfo(virtualPath); templateText = templateFile.ReadAsString(); From 8c9cb1b74743f3b615de4b08517eb77b4ef2152f Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Fri, 18 Jul 2025 20:50:52 +0800 Subject: [PATCH 7/9] continuous optimization --- .../Commands/CommandOptionsBase.cs | 2 +- .../Extensions/FileProviderExtensions.cs | 22 ++++++++++--------- src/AbpHelper.Core/Generator/TextGenerator.cs | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index 1eaa511a..88c8dd40 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -22,7 +22,7 @@ public abstract class CommandOptionsBase public virtual string MapTemplatePath(string subPath) { - if (TemplatePath.IsNullOrWhiteSpace()) + if (string.IsNullOrWhiteSpace(TemplatePath)) { return Path.Combine(new[] { "/Templates", subPath }).NormalizePath(); } diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index 0181dbea..ca0b206a 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -39,8 +39,8 @@ public static class FileProviderExtensions } var physicalFiles = new PhysicalFileProvider(physicalDirectory).GetFilesRecursively("").ToList(); var virtualFiles = files.ToList(); - - return physicalFiles.Concat(virtualFiles.Where(v => !physicalFiles.Any(p => p.Item1 == v.Item1))); + var physicalPaths = new HashSet(physicalFiles.Select(p => p.Item1)); + return physicalFiles.Concat(virtualFiles.Where(v => !physicalPaths.Contains(v.Item1))); } private static readonly string virtualDirectoryPrefix = "/Templates/"; @@ -55,11 +55,12 @@ public static (string, string?) GetTemplateRootDirectoryMirror(this IVirtualFile private static (string, string?) TemplateRootDirectoryMirror(string dir) { - if (dir.StartsWith(virtualDirectoryPrefix)) - { - return (dir, null); - } + if (dir.StartsWith(virtualDirectoryPrefix)) return (dir, null); + var index = dir.IndexOf(virtualDirectoryPrefix); + + if (index == -1) return (dir, null); + var virtualDirectory = dir.Substring(index); var physicalDirectory = dir.Substring(0, index); @@ -73,11 +74,12 @@ private static (string, string?) TemplateRootDirectoryMirror(string dir) /// (virtualDirectory, physicalDirectory) public static (string, string?) GetTemplatePathMirror(this IVirtualFileProvider fileProvider, string dir) { - if (dir.StartsWith(virtualDirectoryPrefix)) - { - return (dir, null); - } + if (dir.StartsWith(virtualDirectoryPrefix)) return (dir, null); + var index = dir.IndexOf(virtualDirectoryPrefix); + + if (index == -1) return (dir, null); + var virtualPath = dir.Substring(index); return (virtualPath, dir); diff --git a/src/AbpHelper.Core/Generator/TextGenerator.cs b/src/AbpHelper.Core/Generator/TextGenerator.cs index fe7e53f2..c7f88644 100644 --- a/src/AbpHelper.Core/Generator/TextGenerator.cs +++ b/src/AbpHelper.Core/Generator/TextGenerator.cs @@ -30,7 +30,7 @@ public string GenerateByTemplateName(string templateDirectory, string templateNa public string GenerateByTemplateName(string templateDirectory, string templateName, object model, out TemplateContext context) { string path = Path.Combine(templateDirectory, templateName).NormalizePath(); - var templateText = ""; + var templateText = string.Empty; if (File.Exists(path)) { templateText = File.ReadAllText(path); From a8e4413875b370b652c2444cf3b979fc015f6afa Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Fri, 18 Jul 2025 22:43:03 +0800 Subject: [PATCH 8/9] Remove magic strings --- src/AbpHelper.Core/AbpHelperCoreConsts.cs | 7 +++++++ src/AbpHelper.Core/Commands/CommandOptionsBase.cs | 11 +++++++++-- .../Extensions/FileProviderExtensions.cs | 10 ++++------ 3 files changed, 20 insertions(+), 8 deletions(-) create mode 100644 src/AbpHelper.Core/AbpHelperCoreConsts.cs diff --git a/src/AbpHelper.Core/AbpHelperCoreConsts.cs b/src/AbpHelper.Core/AbpHelperCoreConsts.cs new file mode 100644 index 00000000..c91d7663 --- /dev/null +++ b/src/AbpHelper.Core/AbpHelperCoreConsts.cs @@ -0,0 +1,7 @@ +namespace EasyAbp.AbpHelper.Core +{ + internal static class AbpHelperCoreConsts + { + internal static readonly string TemplateResourcePathPrefix = "/Templates/"; + } +} diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index 88c8dd40..d97f0af8 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -22,12 +22,19 @@ public abstract class CommandOptionsBase public virtual string MapTemplatePath(string subPath) { + string resourcePathPrefix = AbpHelperCoreConsts.TemplateResourcePathPrefix; + if (string.IsNullOrWhiteSpace(TemplatePath)) { - return Path.Combine(new[] { "/Templates", subPath }).NormalizePath(); + return Path.Combine(new[] { resourcePathPrefix, subPath }).NormalizePath(); + } + + if (AbpHelperCoreConsts.TemplateResourcePathPrefix[0] == '/' || AbpHelperCoreConsts.TemplateResourcePathPrefix[0] == '\\') + { + resourcePathPrefix = resourcePathPrefix.Substring(1); } - return Path.Combine(new[] { TemplatePath!, "Templates", subPath }).NormalizePath(); + return Path.Combine(new[] { TemplatePath!, resourcePathPrefix, subPath }).NormalizePath(); } } } \ No newline at end of file diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index ca0b206a..c69f942e 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -43,8 +43,6 @@ public static class FileProviderExtensions return physicalFiles.Concat(virtualFiles.Where(v => !physicalPaths.Contains(v.Item1))); } - private static readonly string virtualDirectoryPrefix = "/Templates/"; - /// /// If is physical path try to get virtual directory path /// @@ -55,9 +53,9 @@ public static (string, string?) GetTemplateRootDirectoryMirror(this IVirtualFile private static (string, string?) TemplateRootDirectoryMirror(string dir) { - if (dir.StartsWith(virtualDirectoryPrefix)) return (dir, null); + if (dir.StartsWith(AbpHelperCoreConsts.TemplateResourcePathPrefix)) return (dir, null); - var index = dir.IndexOf(virtualDirectoryPrefix); + var index = dir.IndexOf(AbpHelperCoreConsts.TemplateResourcePathPrefix); if (index == -1) return (dir, null); @@ -74,9 +72,9 @@ private static (string, string?) TemplateRootDirectoryMirror(string dir) /// (virtualDirectory, physicalDirectory) public static (string, string?) GetTemplatePathMirror(this IVirtualFileProvider fileProvider, string dir) { - if (dir.StartsWith(virtualDirectoryPrefix)) return (dir, null); + if (dir.StartsWith(AbpHelperCoreConsts.TemplateResourcePathPrefix)) return (dir, null); - var index = dir.IndexOf(virtualDirectoryPrefix); + var index = dir.IndexOf(AbpHelperCoreConsts.TemplateResourcePathPrefix); if (index == -1) return (dir, null); From 67071904cbabc0062df312f98ff7daecfcebe469 Mon Sep 17 00:00:00 2001 From: blackWinds <745673576@qq.com> Date: Fri, 18 Jul 2025 22:52:03 +0800 Subject: [PATCH 9/9] optimization --- src/AbpHelper.Core/Commands/CommandOptionsBase.cs | 3 ++- src/AbpHelper.Core/Extensions/FileProviderExtensions.cs | 5 +---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs index d97f0af8..5621b939 100644 --- a/src/AbpHelper.Core/Commands/CommandOptionsBase.cs +++ b/src/AbpHelper.Core/Commands/CommandOptionsBase.cs @@ -29,7 +29,8 @@ public virtual string MapTemplatePath(string subPath) return Path.Combine(new[] { resourcePathPrefix, subPath }).NormalizePath(); } - if (AbpHelperCoreConsts.TemplateResourcePathPrefix[0] == '/' || AbpHelperCoreConsts.TemplateResourcePathPrefix[0] == '\\') + if (AbpHelperCoreConsts.TemplateResourcePathPrefix.StartsWith('/') || + AbpHelperCoreConsts.TemplateResourcePathPrefix.StartsWith('\\')) { resourcePathPrefix = resourcePathPrefix.Substring(1); } diff --git a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs index c69f942e..3b25bd35 100644 --- a/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs +++ b/src/AbpHelper.Core/Extensions/FileProviderExtensions.cs @@ -31,7 +31,7 @@ public static class FileProviderExtensions public static IEnumerable<(string, IFileInfo)> GetFilesRecursively(this IVirtualFileProvider fileProvider, string dir) { - var (virtualDirectory, physicalDirectory) = TemplateRootDirectoryMirror(dir); + var (virtualDirectory, physicalDirectory) = fileProvider.GetTemplateRootDirectoryMirror(dir); var files = GetFilesRecursively((IFileProvider)fileProvider, virtualDirectory); if (physicalDirectory == null) { @@ -49,9 +49,6 @@ public static class FileProviderExtensions /// /// (virtualDirectory, physicalDirectory) public static (string, string?) GetTemplateRootDirectoryMirror(this IVirtualFileProvider fileProvider, string dir) - => TemplateRootDirectoryMirror(dir); - - private static (string, string?) TemplateRootDirectoryMirror(string dir) { if (dir.StartsWith(AbpHelperCoreConsts.TemplateResourcePathPrefix)) return (dir, null);