From c33ef142d39e6a26c68f68afdda65bbce31ac76e Mon Sep 17 00:00:00 2001 From: Garrett Beatty Date: Mon, 18 Nov 2024 13:13:26 -0500 Subject: [PATCH] Use MSBuild to find target framework --- .../Amazon.Common.DotNetCli.Tools.csproj | 5 +- .../Assets/AmazonCommonDotNetCliTools.targets | 10 +++ .../Utilities.cs | 77 ++++++++++++++++++- 3 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 src/Amazon.Common.DotNetCli.Tools/Assets/AmazonCommonDotNetCliTools.targets diff --git a/src/Amazon.Common.DotNetCli.Tools/Amazon.Common.DotNetCli.Tools.csproj b/src/Amazon.Common.DotNetCli.Tools/Amazon.Common.DotNetCli.Tools.csproj index 8500202..3a89803 100644 --- a/src/Amazon.Common.DotNetCli.Tools/Amazon.Common.DotNetCli.Tools.csproj +++ b/src/Amazon.Common.DotNetCli.Tools/Amazon.Common.DotNetCli.Tools.csproj @@ -11,9 +11,12 @@ + + + + 1701;1702;1705;1591 - \ No newline at end of file diff --git a/src/Amazon.Common.DotNetCli.Tools/Assets/AmazonCommonDotNetCliTools.targets b/src/Amazon.Common.DotNetCli.Tools/Assets/AmazonCommonDotNetCliTools.targets new file mode 100644 index 0000000..f79dabd --- /dev/null +++ b/src/Amazon.Common.DotNetCli.Tools/Assets/AmazonCommonDotNetCliTools.targets @@ -0,0 +1,10 @@ + + + + <_TargetFrameworks Include="$(TargetFramework)" Condition="'$(TargetFramework)' != ''" /> + <_TargetFrameworks Include="$(TargetFrameworks)" Condition="'$(TargetFrameworks)' != ''" /> + + + + + diff --git a/src/Amazon.Common.DotNetCli.Tools/Utilities.cs b/src/Amazon.Common.DotNetCli.Tools/Utilities.cs index 6daa6c8..87425d3 100644 --- a/src/Amazon.Common.DotNetCli.Tools/Utilities.cs +++ b/src/Amazon.Common.DotNetCli.Tools/Utilities.cs @@ -207,14 +207,85 @@ public static string DeterminePublishLocation(string workingDirectory, string pr public static string LookupTargetFrameworkFromProjectFile(string projectLocation) { + var projectFile = FindProjectFileInDirectory(projectLocation); + if (string.IsNullOrEmpty(projectFile)) + { + throw new FileNotFoundException("Could not find a project file in the specified directory."); + } - var xdoc = XDocument.Load(projectFile); + var outputFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + var targetsFile = FindTargetsFile(); + + if (!File.Exists(targetsFile)) + { + throw new FileNotFoundException($"Could not find the custom .targets file at {targetsFile}"); + } + + var arguments = new[] + { + "msbuild", + projectFile, + "/nologo", + "/t:_AmazonCommonToolsExtractTargetFrameworks", + $"/p:_AmazonCommonToolsTargetFrameworksFile={outputFile}", + "/p:Configuration=Debug", + $"\"/p:CustomAfterMicrosoftCommonTargets={targetsFile}\"", + $"\"/p:CustomAfterMicrosoftCommonCrossTargetingTargets={targetsFile}\"" + }; + + var process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "dotnet", + Arguments = string.Join(" ", arguments), + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + } + }; + + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); - var element = xdoc.XPathSelectElement("//PropertyGroup/TargetFramework"); - return element?.Value; + if (process.ExitCode != 0) + { + throw new Exception($"MSBuild process exited with code {process.ExitCode}. See log for details."); + } + + if (File.Exists(outputFile)) + { + var targetFrameworks = File.ReadAllLines(outputFile); + File.Delete(outputFile); // Clean up the temporary file + + if (targetFrameworks.Length > 0) + { + return targetFrameworks[0]; // Return the first framework if there are multiple + } + } + + return null; } + + private static string FindTargetsFile() + { + var assemblyDir = Path.GetDirectoryName(typeof(DotNetCLIWrapper).Assembly.Location); + var searchPaths = new[] + { + Path.Combine(AppContext.BaseDirectory, "Assets"), + Path.Combine(assemblyDir, "Assets"), + AppContext.BaseDirectory, + assemblyDir, + }; + + return searchPaths.Select(p => Path.Combine(p, "AmazonCommonDotNetCliTools.targets")).FirstOrDefault(File.Exists); + } + + /// /// Retrieve the `OutputType` property of a given project ///