Browse Source

Merge pull request #8168 from abpframework/cli-template-build-symbols

Partial implemented: CLI template build symbols
pull/8198/head
Yunus Emre Kalkan 5 years ago
committed by GitHub
parent
commit
f95ceb476d
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 8
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildContext.cs
  2. 22
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveCmsKitStep.cs
  3. 19
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveEfCoreRelatedCodeStep.cs
  4. 21
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveGlobalFeaturesPackageStep.cs
  5. 20
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemovePublicRedisStep.cs
  6. 2
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs
  7. 117
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs
  8. 45
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

8
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ProjectBuildContext.cs

@ -1,4 +1,5 @@
using JetBrains.Annotations;
using System.Collections.Generic;
using JetBrains.Annotations;
using Volo.Abp.Cli.ProjectBuilding.Files;
using Volo.Abp.Cli.ProjectModification;
@ -21,7 +22,9 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
public FileEntryList Files { get; set; }
public ProjectResult Result { get; set; }
public List<string> Symbols { get; } //TODO: Fill the symbols, like "UI-Angular", "CMS-KIT"!
public ProjectBuildContext(
TemplateInfo template,
ModuleInfo module,
@ -34,6 +37,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building
Package = package;
TemplateFile = Check.NotNull(templateFile, nameof(templateFile));
BuildArgs = Check.NotNull(buildArgs, nameof(buildArgs));
Symbols = new List<string>();
Result = new ProjectResult();
}

22
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveCmsKitStep.cs

@ -1,22 +0,0 @@
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemoveCmsKitStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
var commonFiles = context.Files.Where(f =>
f.Name.EndsWith(".csproj") ||
f.Name.EndsWith(".cs") ||
f.Name.EndsWith(".json") ||
f.Name.EndsWith(".cshtml"));
foreach (var file in commonFiles)
{
file.RemoveTemplateCodeIfNot("CMS-KIT");
}
}
}
}

19
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveEfCoreRelatedCodeStep.cs

@ -1,19 +0,0 @@
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemoveEfCoreRelatedCodeStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
foreach (var file in context.Files)
{
if (file.Name.EndsWith(".cs") || file.Name.EndsWith(".csproj") || file.Name.EndsWith(".json"))
{
file.RemoveTemplateCodeIfNot("EFCORE");
}
}
}
}
}

21
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveGlobalFeaturesPackageStep.cs

@ -1,21 +0,0 @@
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemoveGlobalFeaturesPackageStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
var commonFiles = context.Files.Where(f =>
f.Name.EndsWith(".csproj") ||
f.Name.EndsWith(".cs") ||
f.Name.EndsWith(".cshtml"));
foreach (var file in commonFiles)
{
file.RemoveTemplateCodeIf("CMS-KIT");
}
}
}
}

20
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemovePublicRedisStep.cs

@ -1,20 +0,0 @@
using System;
using System.Linq;
using Volo.Abp.Cli.ProjectBuilding.Files;
namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
public class RemovePublicRedisStep : ProjectBuildPipelineStep
{
public override void Execute(ProjectBuildContext context)
{
foreach (var file in context.Files)
{
if (file.Name.EndsWith(".cs") || file.Name.EndsWith(".csproj") || file.Name.EndsWith(".json"))
{
file.RemoveTemplateCodeIfNot("PUBLIC-REDIS");
}
}
}
}
}

2
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/TemplateCodeDeleteStep.cs

@ -10,7 +10,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps
{
if (file.Name.EndsWith(".cs") || file.Name.EndsWith(".csproj") || file.Name.EndsWith(".cshtml") || file.Name.EndsWith(".json"))
{
file.RemoveTemplateCode();
file.RemoveTemplateCode(context.Symbols);
file.RemoveTemplateCodeMarkers();
}
}

117
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Files/FileEntryExtensions.cs

@ -1,4 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
namespace Volo.Abp.Cli.ProjectBuilding.Files
{
@ -11,19 +13,9 @@ namespace Volo.Abp.Cli.ProjectBuilding.Files
return file;
}
public static void RemoveTemplateCode(this FileEntry file)
public static void RemoveTemplateCode(this FileEntry file, List<string> symbols)
{
RemoveMarkedTemplateCode(file, "<TEMPLATE-REMOVE>");
}
public static void RemoveTemplateCodeIf(this FileEntry file, string condition)
{
RemoveByCondition(file, "IF", condition);
}
public static void RemoveTemplateCodeIfNot(this FileEntry file, string condition)
{
RemoveByCondition(file, "IF-NOT", condition);
RemoveMarkedTemplateCode(file, symbols);
}
public static void RemoveTemplateCodeMarkers(this FileEntry file)
@ -57,12 +49,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Files
file.SetLines(newLines);
}
private static void RemoveByCondition(this FileEntry file, string conditionName, string condition)
{
RemoveMarkedTemplateCode(file, $"<TEMPLATE-REMOVE {conditionName}='{condition}'>");
}
private static void RemoveMarkedTemplateCode(this FileEntry file, string beginMark)
private static void RemoveMarkedTemplateCode(this FileEntry file, List<string> symbols)
{
if (!file.Content.Contains("</TEMPLATE-REMOVE>"))
{
@ -76,8 +63,40 @@ namespace Volo.Abp.Cli.ProjectBuilding.Files
for (int i = 0; i < lines.Length; i++)
{
if (lines[i].Contains(beginMark))
if (lines[i].Contains("<TEMPLATE-REMOVE"))
{
var parsedMarker = ParseTemplateRemoveMarker(lines[i]);
bool sectionShouldBeRemoved = false;
if (!parsedMarker.Symbols.Any())
{
sectionShouldBeRemoved = true;
}
else if(parsedMarker.Symbols.Count == 1)
{
sectionShouldBeRemoved = !parsedMarker.IsNegativeCondition
? symbols.Contains(parsedMarker.Symbols[0], StringComparer.InvariantCultureIgnoreCase)
: !symbols.Contains(parsedMarker.Symbols[0], StringComparer.InvariantCultureIgnoreCase);
}
else if (parsedMarker.Operator == Operator.And)
{
sectionShouldBeRemoved = parsedMarker.Symbols.Any(s => !parsedMarker.IsNegativeCondition
? symbols.Contains(s, StringComparer.InvariantCultureIgnoreCase)
: !symbols.Contains(s, StringComparer.InvariantCultureIgnoreCase));
}
else if (parsedMarker.Operator == Operator.Or)
{
sectionShouldBeRemoved = !parsedMarker.Symbols.All(s => !parsedMarker.IsNegativeCondition
? symbols.Contains(s, StringComparer.InvariantCultureIgnoreCase)
: !symbols.Contains(s, StringComparer.InvariantCultureIgnoreCase) == false);
}
if (!sectionShouldBeRemoved)
{
continue;
}
while (i < lines.Length && !lines[i].Contains("</TEMPLATE-REMOVE>"))
{
++i;
@ -94,5 +113,65 @@ namespace Volo.Abp.Cli.ProjectBuilding.Files
file.SetLines(newLines);
}
private static TemplateRemoveMarkerParseResult ParseTemplateRemoveMarker(string marker)
{
var result = new TemplateRemoveMarkerParseResult();
var condition = marker.Trim()
.RemovePreFix("//").Trim()
.RemovePreFix("@*").Trim()
.RemovePreFix("<!--").Trim()
.RemovePreFix("<TEMPLATE-REMOVE").Trim()
.RemovePostFix("*@").Trim()
.RemovePostFix("-->").Trim()
.RemovePostFix(">").Trim();
if (string.IsNullOrWhiteSpace(condition))
{
return result;
}
var conditionSplitted = condition.Split("=");
result.IsNegativeCondition = conditionSplitted[0] == "IF-NOT";
var conditionContent = string.Join("=", conditionSplitted.Skip(1))
.RemovePostFix("\"").RemovePreFix("\"")
.RemovePostFix("'").RemovePreFix("'");
if (conditionContent.Contains("&&"))
{
result.Operator = Operator.And;
result.Symbols = conditionContent.Split("&&").ToList();
}
else if(conditionContent.Contains("||"))
{
result.Operator = Operator.Or;
result.Symbols = conditionContent.Split("||").ToList();
}
else
{
result.Symbols.Add(conditionContent);
}
return result;
}
private class TemplateRemoveMarkerParseResult
{
public List<string> Symbols { get; set; } = new List<string>();
public Operator Operator { get; set; } = Operator.None;
public bool IsNegativeCondition { get; set; }
}
private enum Operator
{
None,
And,
Or
}
}
}

45
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Templates/App/AppTemplateBase.cs

@ -28,6 +28,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
SwitchDatabaseProvider(context, steps);
DeleteUnrelatedProjects(context, steps);
RemoveMigrations(context, steps);
ConfigureTieredArchitecture(context, steps);
ConfigurePublicWebSite(context, steps);
RemoveUnnecessaryPorts(context, steps);
RandomizeSslPorts(context, steps);
@ -64,7 +65,10 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.DbMigrations"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.EntityFrameworkCore.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.EntityFrameworkCore.Tests"));
steps.Add(new RemoveEfCoreRelatedCodeStep());
}
else
{
context.Symbols.Add("EFCORE");
}
if (context.BuildArgs.DatabaseProvider != DatabaseProvider.MongoDb)
@ -144,14 +148,15 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
{
if (!context.BuildArgs.PublicWebSite)
{
if (!context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.Tiered.Long) &&
!context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.Tiered.Long) ||
context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
{
steps.Add(new RemovePublicRedisStep());
context.Symbols.Add("PUBLIC-REDIS");
}
steps.Add(new RemoveCmsKitStep());
return;
}
else
{
context.Symbols.Add("public-website");
}
if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.Tiered.Long) || context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
@ -164,14 +169,9 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
steps.Add(new ChangePublicAuthPortStep());
}
// We disabled cms-kit for v4.2 release.
if (true || context.BuildArgs.ExtraProperties.ContainsKey("without-cms-kit"))
{
steps.Add(new RemoveCmsKitStep());
}
else
if (!context.BuildArgs.ExtraProperties.ContainsKey("without-cms-kit"))
{
steps.Add(new RemoveGlobalFeaturesPackageStep());
context.Symbols.Add("CMS-KIT");
}
}
@ -197,6 +197,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
private static void ConfigureWithBlazorUi(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
context.Symbols.Add("ui:blazor");
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
@ -218,6 +220,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
private static void ConfigureWithBlazorServerUi(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
context.Symbols.Add("ui:blazor-server");
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Blazor"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
@ -242,6 +246,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
private static void ConfigureWithMvcUi(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
context.Symbols.Add("ui:mvc");
if (context.BuildArgs.ExtraProperties.ContainsKey("tiered"))
{
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
@ -262,6 +268,8 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
private static void ConfigureWithAngularUi(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
context.Symbols.Add("ui:angular");
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Host"));
steps.Add(new RemoveProjectFromSolutionStep("MyCompanyName.MyProjectName.Web.Tests", projectFolderPath: "/aspnet-core/test/MyCompanyName.MyProjectName.Web.Tests"));
@ -312,6 +320,15 @@ namespace Volo.Abp.Cli.ProjectBuilding.Templates.App
);
}
private void ConfigureTieredArchitecture(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
if (context.BuildArgs.ExtraProperties.ContainsKey(NewCommand.Options.Tiered.Long) ||
context.BuildArgs.ExtraProperties.ContainsKey("separate-identity-server"))
{
context.Symbols.Add("tiered");
}
}
private static void RandomizeStringEncryption(ProjectBuildContext context, List<ProjectBuildPipelineStep> steps)
{
steps.Add(new RandomizeStringEncryptionStep());

Loading…
Cancel
Save