using MsbuildAnalyzer.Models; namespace MsbuildAnalyzer.Utilities; /// /// Build target creation methods for TargetBuilder. /// public static partial class TargetBuilder { /// /// Shared helper method to create build targets (both debug and release variants). /// private static Target CreateBuildTarget( string targetName, string fileName, string projectName, Dictionary properties, string projectDirectory, string workspaceRoot, PluginOptions options, string productionInput, string defaultConfiguration, string description, List directoryBuildInputs) { var outputPath = GetOutputPath(properties, projectName, projectDirectory, workspaceRoot); var intermediatePath = GetIntermediateOutputPath(properties, projectName, projectDirectory, workspaceRoot); string[] defaultFlags = ["--no-restore", "--no-dependencies"]; var defaultArgs = defaultConfiguration == "Release" ? [.. defaultFlags, "--configuration", "Release"] : defaultFlags; return new Target { Command = "dotnet build", Options = new TargetOptions { Cwd = "{projectRoot}", Args = defaultArgs }, Configurations = new Dictionary { ["debug"] = new TargetConfiguration { Args = [.. defaultFlags, "--configuration", "Debug"] }, ["release"] = new TargetConfiguration { Args = [.. defaultFlags, "--configuration", "Release"] } }, DependsOn = [$"^{targetName}"], Cache = true, Inputs = [ productionInput, $"^{productionInput}", "{workspaceRoot}/.editorconfig", new { workingDirectory = "absolute" }, new { dependentTasksOutputFiles = "**/*" }, .. directoryBuildInputs ], Outputs = new[] { outputPath, intermediatePath } .Where(p => p is not null) .ToArray()!, Metadata = new TargetMetadata { Description = description, Technologies = ProjectUtilities.GetTechnologies(fileName) } }; } private static void AddBuildTarget( Dictionary targets, string projectName, string fileName, bool isTest, Dictionary properties, string projectDirectory, string workspaceRoot, PluginOptions options, string productionInput, List directoryBuildInputs) { var targetName = options.BuildTargetName; targets[targetName] = CreateBuildTarget( targetName, fileName, projectName, properties, projectDirectory, workspaceRoot, options, productionInput, "Debug", "Build the .NET project", directoryBuildInputs); } private static void AddBuildReleaseTarget( Dictionary targets, string projectName, string fileName, bool isTest, Dictionary properties, string projectDirectory, string workspaceRoot, PluginOptions options, string productionInput, List directoryBuildInputs) { var releaseTargetName = $"{options.BuildTargetName}:release"; targets[releaseTargetName] = CreateBuildTarget( releaseTargetName, fileName, projectName, properties, projectDirectory, workspaceRoot, options, productionInput, "Release", "Build the .NET project in Release configuration", directoryBuildInputs); } }