From fac52f3353665d529755715a3e0423d127061e22 Mon Sep 17 00:00:00 2001 From: Daniel Plaisted Date: Thu, 15 Aug 2019 19:15:02 -0700 Subject: [PATCH] Fix regression in selecting default RuntimeIdentifier Fixes #3495 --- .../ResolvePackageAssets.cs | 16 +++++++++ ...oft.NET.RuntimeIdentifierInference.targets | 16 +++++++-- ...rosoft.PackageDependencyResolution.targets | 1 + .../GivenThatWeWantToBuildADesktopExe.cs | 35 +++++++++++++++++++ 4 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs index a5d5713bb1b9..99e25afdb9f2 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolvePackageAssets.cs @@ -222,6 +222,9 @@ public sealed class ResolvePackageAssets : TaskBase [Output] public ITaskItem[] ApphostsForShimRuntimeIdentifiers { get; private set; } + [Output] + public ITaskItem[] PackagesReferenced { get; private set; } + /// /// Messages from the assets file. /// These are logged directly and therefore not returned to the targets (note private here). @@ -306,6 +309,7 @@ private void ReadItemGroups() FrameworkReferences = reader.ReadItemGroup(); NativeLibraries = reader.ReadItemGroup(); PackageFolders = reader.ReadItemGroup(); + PackagesReferenced = reader.ReadItemGroup(); ResourceAssemblies = reader.ReadItemGroup(); RuntimeAssemblies = reader.ReadItemGroup(); RuntimeTargets = reader.ReadItemGroup(); @@ -769,6 +773,7 @@ private void WriteItemGroups() WriteItemGroup(WriteFrameworkReferences); WriteItemGroup(WriteNativeLibraries); WriteItemGroup(WritePackageFolders); + WriteItemGroup(WritePackagesReferenced); WriteItemGroup(WriteResourceAssemblies); WriteItemGroup(WriteRuntimeAssemblies); WriteItemGroup(WriteRuntimeTargets); @@ -1091,6 +1096,17 @@ private void WritePackageFolders() } } + private void WritePackagesReferenced() + { + foreach (var library in _runtimeTarget.Libraries) + { + if (library.IsPackage()) + { + WriteItem(library.Name); + } + } + } + private void WriteResourceAssemblies() { WriteItems( diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets index 0b329566854c..6c08f8e37612 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.RuntimeIdentifierInference.targets @@ -182,9 +182,19 @@ Copyright (c) .NET Foundation. All rights reserved. AfterTargets="ResolvePackageAssets" BeforeTargets="CoreCompile" Condition="'$(_UsingDefaultPlatformTarget)' == 'true' and - '$(_UsingDefaultRuntimeIdentifier)' == 'true' and - '@(NativeCopyLocalItems)' == ''"> - + '$(_UsingDefaultRuntimeIdentifier)' == 'true'"> + + + <_ReferencedPlatformPackage Include="@(PackagesReferenced)" Condition="'%(Identity)' == 'Microsoft.NETCore.Platforms'" /> + + + + + AnyCPU diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets index 11553d7eac09..1c5f299eec92 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.PackageDependencyResolution.targets @@ -272,6 +272,7 @@ Copyright (c) .NET Foundation. All rights reserved. + diff --git a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildADesktopExe.cs b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildADesktopExe.cs index 31eaaa7178b6..8e7ba4da7879 100644 --- a/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildADesktopExe.cs +++ b/src/Tests/Microsoft.NET.Build.Tests/GivenThatWeWantToBuildADesktopExe.cs @@ -53,6 +53,41 @@ public void It_builds_a_simple_desktop_app() }); } + // Windows only because default RuntimeIdentifier only applies when current OS is Windows + [WindowsOnlyTheory] + [InlineData(false, "AnyCPU")] + [InlineData(true, "x86")] + public void RuntimeIdentifierIsOnlyInferredIfPlatformsPackageIsReferenced(bool referencePlatformPackage, string expectedPlatform) + { + var testProject = new TestProject() + { + Name = "AutoRuntimeIdentifierTest", + TargetFrameworks = "net472", + IsSdkProject = true, + IsExe = true + }; + + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.DiasymReader.Native", "1.7.0")); + if (referencePlatformPackage) + { + testProject.PackageReferences.Add(new TestPackageReference("Microsoft.NETCore.Platforms", "2.1.0")); + } + + var testAsset = _testAssetsManager.CreateTestProject(testProject, identifier: referencePlatformPackage.ToString()) + .Restore(Log, testProject.Name); + + var buildCommand = new BuildCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name)); + + buildCommand.Execute() + .Should() + .Pass(); + + var getValueCommand = new GetValuesCommand(Log, Path.Combine(testAsset.TestRoot, testProject.Name), testProject.TargetFrameworks, "PlatformTarget"); + + getValueCommand.Execute().Should().Should(); + getValueCommand.GetValues().Single().Should().Be(expectedPlatform); + } + [WindowsOnlyTheory] // If we don't set platformTarget and don't use native dependency, we get working AnyCPU app. [InlineData("defaults", null, false, "Native code was not used (MSIL)")]