From 09344cb6ff1e85f49a302f9c9e4df505f9709aac Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Tue, 30 Sep 2025 11:10:51 +0300 Subject: [PATCH] Made SolutionFileModifier work with slnx files --- .../Steps/RemoveProjectFromSolutionStep.cs | 3 +- .../SolutionFileModifier.cs | 77 ++++++++++++++++--- 2 files changed, 69 insertions(+), 11 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 484b9e991e..3f3046a584 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,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Xml; using Newtonsoft.Json.Linq; @@ -80,7 +81,7 @@ public class RemoveProjectFromSolutionStep : ProjectBuildPipelineStep } var normalized = pathAttr.Replace('\\', '/'); - var fileNameWithoutExtension = System.IO.Path.GetFileNameWithoutExtension(normalized); + var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(normalized); if (string.Equals(fileNameWithoutExtension, _projectName, StringComparison.OrdinalIgnoreCase)) { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs index b1678eaca9..85abe40195 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs @@ -4,15 +4,82 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Xml; +using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; namespace Volo.Abp.Cli.ProjectModification; public class SolutionFileModifier : ITransientDependency { + private readonly ICmdHelper _cmdHelper; public static Encoding DefaultEncoding = Encoding.UTF8; + public SolutionFileModifier(ICmdHelper cmdHelper) + { + _cmdHelper = cmdHelper; + } + public async Task RemoveProjectFromSolutionFileAsync(string solutionFile, string projectName) + { + if (solutionFile.EndsWith(".sln")) + { + await RemoveProjectFromSlnFileAsync(solutionFile, projectName); + } + else + { + await RemoveProjectFromSlnxFileAsync(solutionFile, projectName); + } + } + + public async Task AddModuleToSolutionFileAsync(ModuleWithMastersInfo module, string solutionFile) + { + await AddModuleAsync(module, solutionFile); + } + + public async Task AddPackageToSolutionFileAsync(NugetPackageInfo package, string solutionFile) + { + await AddPackageAsync(package, solutionFile); + } + + private async Task RemoveProjectFromSlnxFileAsync(string solutionFile, string projectName) + { + var document = new XmlDocument { PreserveWhitespace = true }; + document.Load(solutionFile); + 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 = Path.GetFileNameWithoutExtension(normalized); + + if (string.Equals(fileNameWithoutExtension, projectName, StringComparison.OrdinalIgnoreCase)) + { + nodesToBeRemoved.Add(projectNode); + } + } + + foreach (var node in nodesToBeRemoved) + { + node.ParentNode!.RemoveChild(node); + } + + await File.WriteAllTextAsync(solutionFile, document.OuterXml); + } + + private async Task RemoveProjectFromSlnFileAsync(string solutionFile, string projectName) { using (var fileStream = File.Open(solutionFile, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { @@ -36,16 +103,6 @@ public class SolutionFileModifier : ITransientDependency } } - public async Task AddModuleToSolutionFileAsync(ModuleWithMastersInfo module, string solutionFile) - { - await AddModuleAsync(module, solutionFile); - } - - public async Task AddPackageToSolutionFileAsync(NugetPackageInfo package, string solutionFile) - { - await AddPackageAsync(package, solutionFile); - } - private async Task AddPackageAsync(NugetPackageInfo package, string solutionFile) { var srcFolderId = await AddNewFolderAndGetIdOrGetExistingIdAsync(solutionFile, "src");