From e783d57aeda66f8d6c646a80f76cfcac2beeb496 Mon Sep 17 00:00:00 2001 From: maliming Date: Wed, 21 Jan 2026 14:43:09 +0800 Subject: [PATCH 1/4] Fix project file filtering and solution command execution --- .../Cli/ProjectModification/DerivedClassFinder.cs | 12 +++++++++--- .../Cli/ProjectModification/SolutionFileModifier.cs | 13 +++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/DerivedClassFinder.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/DerivedClassFinder.cs index 5462f3e9fb..b8f1d77bc8 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/DerivedClassFinder.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/DerivedClassFinder.cs @@ -26,10 +26,10 @@ public class DerivedClassFinder : ITransientDependency var binFile = Path.Combine(csprojFileDirectory, "bin"); var objFile = Path.Combine(csprojFileDirectory, "obj"); - var csFiles = new DirectoryInfo(csprojFileDirectory) .GetFiles("*.cs", SearchOption.AllDirectories) - .Where(f => f.DirectoryName != null && (!f.DirectoryName.StartsWith(binFile) || !f.DirectoryName.StartsWith(objFile))) + .Where(f => !f.FullName.StartsWith(binFile, StringComparison.OrdinalIgnoreCase) && + !f.FullName.StartsWith(objFile, StringComparison.OrdinalIgnoreCase)) .Select(f => f.FullName) .ToList(); @@ -53,7 +53,13 @@ public class DerivedClassFinder : ITransientDependency protected bool IsDerived(string csFile, string baseClass) { - var root = CSharpSyntaxTree.ParseText(File.ReadAllText(csFile)).GetRoot(); + var csFileText = File.ReadAllText(csFile); + if (!csFileText.Contains("class")) + { + return false; + } + + var root = CSharpSyntaxTree.ParseText(csFileText).GetRoot(); var namespaceSyntax = root.DescendantNodes().OfType().FirstOrDefault(); var classDeclaration = (namespaceSyntax?.DescendantNodes().OfType())?.FirstOrDefault(); 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 7a815df81d..f24dea1e07 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 @@ -18,16 +18,17 @@ public class SolutionFileModifier : ITransientDependency { _cmdHelper = cmdHelper; } - + public async Task RemoveProjectFromSolutionFileAsync(string solutionFile, string projectName) { - var list = _cmdHelper.RunCmdAndGetOutput($"dotnet sln \"{solutionFile}\" list"); + var workingDirectory = Path.GetDirectoryName(solutionFile); + var list = _cmdHelper.RunCmdAndGetOutput($"dotnet sln \"{solutionFile}\" list", workingDirectory: workingDirectory); foreach (var line in list.Split(new[] { Environment.NewLine, "\n" }, StringSplitOptions.None)) { if (Path.GetFileNameWithoutExtension(line.Trim()).Equals(projectName, StringComparison.InvariantCultureIgnoreCase)) { - _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" remove \"{line.Trim()}\""); + _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" remove \"{line.Trim()}\"", workingDirectory: workingDirectory); break; } } @@ -54,7 +55,7 @@ public class SolutionFileModifier : ITransientDependency Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name), "*.csproj", SearchOption.AllDirectories); - + var projectsUnderTest = new List(); if (Directory.Exists(Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name, "test"))) { @@ -70,10 +71,10 @@ public class SolutionFileModifier : ITransientDependency var projectId = Path.GetFileName(projectPath).Replace(".csproj", ""); var package = @$"modules\{module.Name}\{folder}\{projectId}\{projectId}.csproj"; - + _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}"); } - + if (module.MasterModuleInfos != null) { foreach (var masterModule in module.MasterModuleInfos) From 2cba1a965d340d2d22846f33d79f583626489e7e Mon Sep 17 00:00:00 2001 From: Ma Liming Date: Wed, 21 Jan 2026 15:23:20 +0800 Subject: [PATCH 2/4] Update framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Volo/Abp/Cli/ProjectModification/SolutionFileModifier.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 f24dea1e07..0c0b7bbfd9 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 @@ -72,7 +72,7 @@ public class SolutionFileModifier : ITransientDependency var projectId = Path.GetFileName(projectPath).Replace(".csproj", ""); var package = @$"modules\{module.Name}\{folder}\{projectId}\{projectId}.csproj"; - _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}"); + _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}", workingDirectory: Path.GetDirectoryName(solutionFile)); } if (module.MasterModuleInfos != null) From 304b89d74724c50aa0e6a379736a0690540270f0 Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 22 Jan 2026 10:31:31 +0800 Subject: [PATCH 3/4] Refactor solution file path handling in module addition --- .../Cli/ProjectModification/SolutionFileModifier.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) 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 0c0b7bbfd9..ecdbb9b959 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 @@ -51,16 +51,17 @@ public class SolutionFileModifier : ITransientDependency private async Task AddModuleAsync(ModuleWithMastersInfo module, string solutionFile) { + var slnDir = Path.GetDirectoryName(solutionFile); var projectsUnderModule = Directory.GetFiles( - Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name), + Path.Combine(slnDir, "modules", module.Name), "*.csproj", SearchOption.AllDirectories); var projectsUnderTest = new List(); - if (Directory.Exists(Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name, "test"))) + if (Directory.Exists(Path.Combine(slnDir, "modules", module.Name, "test"))) { projectsUnderTest = Directory.GetFiles( - Path.Combine(Path.GetDirectoryName(solutionFile), "modules", module.Name, "test"), + Path.Combine(slnDir, "modules", module.Name, "test"), "*.csproj", SearchOption.AllDirectories).ToList(); } @@ -68,11 +69,9 @@ public class SolutionFileModifier : ITransientDependency foreach (var projectPath in projectsUnderModule) { var folder = projectsUnderTest.Contains(projectPath) ? "test" : "src"; - var projectId = Path.GetFileName(projectPath).Replace(".csproj", ""); - var package = @$"modules\{module.Name}\{folder}\{projectId}\{projectId}.csproj"; - - _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}", workingDirectory: Path.GetDirectoryName(solutionFile)); + var package = Path.Combine(slnDir, "modules", module.Name, folder, projectId, $"{projectId}.csproj"); + _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}", workingDirectory: slnDir); } if (module.MasterModuleInfos != null) From 68aa880c34c3eeab7aa8cc22f035073dd00d576e Mon Sep 17 00:00:00 2001 From: maliming Date: Thu, 22 Jan 2026 16:49:54 +0800 Subject: [PATCH 4/4] Update solution folder structure for project addition --- .../Abp/Cli/ProjectModification/SolutionFileModifier.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 ecdbb9b959..c8d9127a2c 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 @@ -68,10 +68,8 @@ public class SolutionFileModifier : ITransientDependency foreach (var projectPath in projectsUnderModule) { - var folder = projectsUnderTest.Contains(projectPath) ? "test" : "src"; - var projectId = Path.GetFileName(projectPath).Replace(".csproj", ""); - var package = Path.Combine(slnDir, "modules", module.Name, folder, projectId, $"{projectId}.csproj"); - _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{package}\" --solution-folder {folder}", workingDirectory: slnDir); + var solutionFolder = projectsUnderTest.Contains(projectPath) ? Path.Combine("test", module.Name) : Path.Combine("modules", module.Name); + _cmdHelper.RunCmd($"dotnet sln \"{solutionFile}\" add \"{projectPath}\" --solution-folder \"{solutionFolder}\"", workingDirectory: slnDir); } if (module.MasterModuleInfos != null)