From d718c2e9523c3cd013c25c00066c3989ec4c7548 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 30 Sep 2025 10:59:59 +0300 Subject: [PATCH] Made RemoveProjectFromSolutionStep work with slnx files --- .../Steps/RemoveProjectFromSolutionStep.cs | 93 +++++++++++++++---- 1 file changed, 77 insertions(+), 16 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs index 463c8cca58..484b9e991e 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/Building/Steps/RemoveProjectFromSolutionStep.cs @@ -1,49 +1,110 @@ using System; using System.Collections.Generic; using System.Linq; -using Newtonsoft.Json; +using System.Xml; using Newtonsoft.Json.Linq; +using Volo.Abp.Cli.ProjectBuilding.Files; +using Formatting = Newtonsoft.Json.Formatting; namespace Volo.Abp.Cli.ProjectBuilding.Building.Steps; public class RemoveProjectFromSolutionStep : ProjectBuildPipelineStep { private readonly string _projectName; - private string _solutionFilePath; + private string _solutionFilePathWithoutFileExtension; private string _projectFolderPath; private string ProjectNameWithQuotes => $"\"{_projectName}\""; public RemoveProjectFromSolutionStep( string projectName, - string solutionFilePath = null, + string solutionFilePathWithoutFileExtension = null, string projectFolderPath = null) { _projectName = projectName; - _solutionFilePath = solutionFilePath; _projectFolderPath = projectFolderPath; + + if (solutionFilePathWithoutFileExtension != null && solutionFilePathWithoutFileExtension.EndsWith(".sln")) + { + _solutionFilePathWithoutFileExtension = solutionFilePathWithoutFileExtension.RemovePostFix(".sln"); + } + else + { + _solutionFilePathWithoutFileExtension = solutionFilePathWithoutFileExtension; + } } public override void Execute(ProjectBuildContext context) { SetSolutionAndProjectPathsIfNull(context); - if (_solutionFilePath == null || _projectFolderPath == null) + if (_solutionFilePathWithoutFileExtension == null || _projectFolderPath == null) { return; } new RemoveFolderStep(_projectFolderPath).Execute(context); - var solutionFile = context.GetFile(_solutionFilePath); - solutionFile.NormalizeLineEndings(); - solutionFile.SetLines(RemoveProject(solutionFile.GetLines().ToList())); + var solutionFile = context.FindFile(_solutionFilePathWithoutFileExtension + ".sln") + ?? context.GetFile(_solutionFilePathWithoutFileExtension + ".slnx"); + + if (solutionFile.Name.EndsWith(".sln")) + { + RemoveProjectFromSlnFile(solutionFile); + } + else + { + RemoveProjectFromSlnxFile(solutionFile); + } RemoveProjectFromAbpmdlFile(context); } + private void RemoveProjectFromSlnxFile(FileEntry solutionFile) + { + var document = new XmlDocument { PreserveWhitespace = true }; + document.LoadXml(solutionFile.Content); + var projectNodes = document.SelectNodes("/Solution/Folder/Project"); + + if (projectNodes == null || projectNodes.Count < 1) + { + return; + } + + var nodesToBeRemoved = new List(); + foreach (XmlNode projectNode in projectNodes) + { + var pathAttr = projectNode.Attributes?["Path"]?.Value; + if (string.IsNullOrWhiteSpace(pathAttr)) + { + continue; + } + + var normalized = pathAttr.Replace('\\', '/'); + var fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(normalized); + + if (string.Equals(fileNameWithoutExtension, _projectName, StringComparison.OrdinalIgnoreCase)) + { + nodesToBeRemoved.Add(projectNode); + } + } + + foreach (var node in nodesToBeRemoved) + { + node.ParentNode!.RemoveChild(node); + } + + solutionFile.SetContent(document.OuterXml); + } + + private void RemoveProjectFromSlnFile(FileEntry solutionFile) + { + solutionFile.NormalizeLineEndings(); + solutionFile.SetLines(RemoveProject(solutionFile.GetLines().ToList())); + } + private void RemoveProjectFromAbpmdlFile(ProjectBuildContext context) { - var abpmdlFile = context.FindFile(_solutionFilePath.RemovePostFix(".slnx").RemovePostFix(".sln") + ".abpmdl"); + var abpmdlFile = context.FindFile(_solutionFilePathWithoutFileExtension + ".abpmdl"); if (abpmdlFile == null) { @@ -106,14 +167,14 @@ public class RemoveProjectFromSolutionStep : ProjectBuildPipelineStep private void SetSolutionAndProjectPathsIfNull(ProjectBuildContext context) { - if (_solutionFilePath == null) + if (_solutionFilePathWithoutFileExtension == null) { - _solutionFilePath = context.FindFile("/aspnet-core/MyCompanyName.MyProjectName.sln")?.Name ?? - context.FindFile("/aspnet-core/MyCompanyName.MyProjectName.slnx")?.Name ?? - context.FindFile("/MyCompanyName.MyProjectName.sln")?.Name ?? - context.FindFile("/MyCompanyName.MyProjectName.slnx")?.Name ?? - context.FindFile("/MyCompanyName.MyProjectName.MicroserviceName.sln")?.Name ?? - context.FindFile("/MyCompanyName.MyProjectName.MicroserviceName.slnx")?.Name; + _solutionFilePathWithoutFileExtension = context.FindFile("/aspnet-core/MyCompanyName.MyProjectName.sln")?.Name.RemovePostFix(".sln") ?? + context.FindFile("/aspnet-core/MyCompanyName.MyProjectName.slnx")?.Name.RemovePostFix(".slnx") ?? + context.FindFile("/MyCompanyName.MyProjectName.sln")?.Name.RemovePostFix(".sln") ?? + context.FindFile("/MyCompanyName.MyProjectName.slnx")?.Name.RemovePostFix(".slnx") ?? + context.FindFile("/MyCompanyName.MyProjectName.MicroserviceName.sln")?.Name.RemovePostFix(".sln") ?? + context.FindFile("/MyCompanyName.MyProjectName.MicroserviceName.slnx")?.Name.RemovePostFix(".slnx"); } if (_projectFolderPath == null) {