From 88025ddac72b1fbb9a3608be327242448d35c975 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Fri, 11 Oct 2019 10:02:56 +0300 Subject: [PATCH] added ReplaceCommonPropsStep --- .../ModuleProjectBuildPipelineBuilder.cs | 1 + .../Steps/ProjectReferenceReplaceStep.cs | 6 +- .../Building/Steps/ReplaceCommonPropsStep.cs | 96 +++++++++++++++++++ 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs index fc2a5b0dbc..5eba01b388 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/ModuleProjectBuildPipelineBuilder.cs @@ -10,6 +10,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building pipeline.Steps.Add(new FileEntryListReadStep()); pipeline.Steps.Add(new ProjectReferenceReplaceStep()); + pipeline.Steps.Add(new ReplaceCommonPropsStep()); pipeline.Steps.Add(new CreateProjectResultZipStep()); return pipeline; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs index 44c4f9c0aa..29f5afb19c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ProjectReferenceReplaceStep.cs @@ -22,7 +22,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps new ProjectReferenceReplacer.LocalProjectPathReferenceReplacer( context.Files, - context.Module.Namespace, + context.Module?.Namespace ?? "MyCompanyName.MyProjectName", localAbpRepoPath ).Run(); } @@ -37,7 +37,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps new ProjectReferenceReplacer.NugetReferenceReplacer( context.Files, - "MyCompanyName.MyProjectName", + context.Module?.Namespace ?? "MyCompanyName.MyProjectName", nugetPackageVersion ).Run(); } @@ -108,7 +108,7 @@ namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps var oldNodeIncludeValue = oldNode.Attributes["Include"].Value; // ReSharper disable once PossibleNullReferenceException : Can not be null because nodes are selected with include attribute filter in previous method - if (oldNodeIncludeValue.Contains($"{_projectName}")) + if (oldNodeIncludeValue.Contains(_projectName)) { continue; } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs new file mode 100644 index 0000000000..07b2081738 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/ReplaceCommonPropsStep.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text.RegularExpressions; +using System.Xml; +using Volo.Abp.Cli.ProjectBuilding.Files; + +namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps +{ + public class ReplaceCommonPropsStep : ProjectBuildPipelineStep + { + public override void Execute(ProjectBuildContext context) + { + new CommonPropsReplacer(context.Files).Run(); + } + + private class CommonPropsReplacer + { + private readonly List _entries; + + public CommonPropsReplacer( + List entries) + { + _entries = entries; + } + + public void Run() + { + foreach (var fileEntry in _entries) + { + if (fileEntry.Name.EndsWith(".csproj")) + { + fileEntry.SetContent(ProcessFileContent(fileEntry.Content)); + } + } + } + + private string ProcessFileContent(string content) + { + Check.NotNull(content, nameof(content)); + + var doc = new XmlDocument() { PreserveWhitespace = true }; + + doc.Load(GenerateStreamFromString(content)); + + return ProcessReferenceNodes(doc, content); + } + + private string ProcessReferenceNodes(XmlDocument doc, string content) + { + Check.NotNull(content, nameof(content)); + + var importNodes = doc.SelectNodes("/Project/Import[@Project]"); + + if (importNodes == null) + { + return doc.OuterXml; + } + + foreach (XmlNode node in importNodes) + { + if (!(node.Attributes?["Project"]?.Value?.EndsWith("\\common.props") ?? false)) + { + continue; + } + + node.ParentNode?.RemoveChild(node); + } + + var propertyGroupNodes = doc.SelectNodes("/Project/PropertyGroup"); + + if (propertyGroupNodes == null || propertyGroupNodes.Count < 1) + { + return doc.OuterXml; + } + + var firstPropertyGroupNode = propertyGroupNodes.Item(0); + var langNode = doc.CreateElement("LangVersion"); + langNode.InnerText = "latest"; + firstPropertyGroupNode?.PrependChild(langNode); + + return doc.OuterXml; + } + + private static Stream GenerateStreamFromString(string s) + { + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(s); + writer.Flush(); + stream.Position = 0; + return stream; + } + } + } +}