From 527c3995488e4797fdf891671263ddf61a62c849 Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Wed, 15 Oct 2025 16:05:49 -0400 Subject: [PATCH] Add support for building tool packages with runtime identifier set without building RID-specific packages --- .../targets/Microsoft.NET.PackTool.targets | 12 +++--- .../GivenThatWeWantToPackAToolProject.cs | 37 +++++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.PackTool.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.PackTool.targets index 0ac75dd8f8ae..8fdd129a44c6 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.PackTool.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.PackTool.targets @@ -54,8 +54,8 @@ NOTE: This file is imported from the following contexts, so be aware when writin <_ToolRidsAreOnlyShims Condition="'$(RuntimeIdentifiers)' == '' and $(PackAsToolShimRuntimeIdentifiers) != '' ">true <_UserSpecifiedToolPackageRids Condition="'$(ToolPackageRuntimeIdentifiers)' != ''">$(ToolPackageRuntimeIdentifiers) <_UserSpecifiedToolPackageRids Condition="'$(_UserSpecifiedToolPackageRids)' == ''">$(RuntimeIdentifiers) - <_HasRIDSpecificTools Condition=" '$(_UserSpecifiedToolPackageRids)' != '' ">true - <_HasRIDSpecificTools Condition="'$(_HasRIDSpecificTools)' == ''">false + true + false $(_UserSpecifiedToolPackageRids);$(PackAsToolShimRuntimeIdentifiers) @@ -65,7 +65,7 @@ NOTE: This file is imported from the following contexts, so be aware when writin <_InnerToolsPublishAot>false - <_InnerToolsPublishAot Condition="$(_HasRIDSpecificTools) and '$(PublishAot)' == 'true'">true + <_InnerToolsPublishAot Condition="$(CreateRidSpecificToolPackages) and '$(PublishAot)' == 'true'">true - + $(PackageId).$(RuntimeIdentifier) @@ -390,7 +390,7 @@ NOTE: This file is imported from the following contexts, so be aware when writin - <_ToolPackageType Condition="'$(RuntimeIdentifier)' != '' And '$(_HasRIDSpecificTools)' != ''">DotnetToolRidPackage + <_ToolPackageType Condition="'$(RuntimeIdentifier)' != '' And $(CreateRidSpecificToolPackages)">DotnetToolRidPackage <_ToolPackageType Condition="'$(_ToolPackageType)' == ''">DotnetTool @@ -427,7 +427,7 @@ NOTE: This file is imported from the following contexts, so be aware when writin We can't call this for AOT'd tools because we can't AOT cross-architecture and cross-platform in .NET today. --> <_PackageRids>$(ToolPackageRuntimeIdentifiers) diff --git a/test/Microsoft.NET.ToolPack.Tests/GivenThatWeWantToPackAToolProject.cs b/test/Microsoft.NET.ToolPack.Tests/GivenThatWeWantToPackAToolProject.cs index c9e05aa6a0d5..36fdf6037ab4 100644 --- a/test/Microsoft.NET.ToolPack.Tests/GivenThatWeWantToPackAToolProject.cs +++ b/test/Microsoft.NET.ToolPack.Tests/GivenThatWeWantToPackAToolProject.cs @@ -323,5 +323,42 @@ public void Given_targetplatform_set_It_should_error() result.Should().Fail().And.HaveStdOutContaining("NETSDK1146"); } + + [Fact] + public void It_packs_with_RuntimeIdentifier() + { + var testProject = new TestProject("ToolWithRuntimeIdentifier") + { + TargetFrameworks = ToolsetInfo.CurrentTargetFramework, + IsExe = true, + RuntimeIdentifier = EnvironmentInfo.GetCompatibleRid() + }; + testProject.AdditionalProperties["PackAsTool"] = "true"; + testProject.AdditionalProperties["ImplicitUsings"] = "enable"; + testProject.AdditionalProperties["CreateRidSpecificToolPackages"] = "false"; + testProject.AdditionalProperties["UseAppHost"] = "false"; + + + var testAsset = _testAssetsManager.CreateTestProject(testProject); + + var packCommand = new PackCommand(testAsset); + + packCommand.Execute().Should().Pass(); + + packCommand.GetPackageDirectory().Should().HaveFile($"{testProject.Name}.1.0.0.nupkg"); + packCommand.GetPackageDirectory().Should().NotHaveFile($"{testProject.Name}.{testProject.RuntimeIdentifier}.1.0.0.nupkg"); + + var nupkgPath = packCommand.GetNuGetPackage(); + + using (var nupkgReader = new PackageArchiveReader(nupkgPath)) + { + var toolSettingsItem = nupkgReader.GetToolItems().SelectMany(g => g.Items).SingleOrDefault(i => i.Equals($"tools/{testProject.TargetFrameworks}/{testProject.RuntimeIdentifier}/DotnetToolSettings.xml")); + toolSettingsItem.Should().NotBeNull(); + + var toolSettingsXml = XDocument.Load(nupkgReader.GetStream(toolSettingsItem)); + toolSettingsXml.Root.Attribute("Version").Value.Should().Be("1"); + } + + } } }