From 391722bcc13af568b807ebac1984dd91e9cbe74e Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Fri, 1 Nov 2024 13:30:45 -0500 Subject: [PATCH 1/3] Allow ProjectReferences to not have the _GetRequiredWorkloads Target This prevents a ProjectReference to an esproj project (and other project types) from failing when `dotnet workload restore` is called on a .NET project. --- .../targets/Microsoft.NET.Sdk.ImportWorkloads.targets | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets index 85a407989e7a..d3be69d6d2e8 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets @@ -42,14 +42,17 @@ Copyright (c) .NET Foundation. All rights reserved. + need to be set to "true" to avoid requiring restore (which would likely fail if the required workloads aren't already installed). + In addition, since this is a target that is called on potentially-unsupported project types like esproj, we need to not fail + if the Target is missing. --> + RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)$(_GlobalPropertiesToRemoveFromProjectReferences);TargetFramework;TargetFrameworks" + SkipNonexistentProjects="true" > From 3f806ffcee3497b932aa5af0932939422a3892fb Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Sat, 2 Nov 2024 22:46:48 -0500 Subject: [PATCH 2/3] Update src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets --- .../targets/Microsoft.NET.Sdk.ImportWorkloads.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets index d3be69d6d2e8..a1596a8bf2d4 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets +++ b/src/Tasks/Microsoft.NET.Build.Tasks/targets/Microsoft.NET.Sdk.ImportWorkloads.targets @@ -52,7 +52,7 @@ Copyright (c) .NET Foundation. All rights reserved. BuildInParallel="$(BuildInParallel)" Condition="'%(_MSBuildProjectReferenceExistent.BuildReference)' == 'true' and '@(_MSBuildProjectReferenceExistent)' != ''" RemoveProperties="%(_MSBuildProjectReferenceExistent.GlobalPropertiesToRemove)$(_GlobalPropertiesToRemoveFromProjectReferences);TargetFramework;TargetFrameworks" - SkipNonexistentProjects="true" > + SkipNonexistentTargets="true" > From 6163fc735620811c3ff2fbd2ed5f88cbc9592f80 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Wed, 6 Nov 2024 13:08:12 -0600 Subject: [PATCH 3/3] Add test and asset to prevent regressing the transitive behavior. --- .../ProjectWithEsProjReference/App.csproj | 10 ++++++++++ .../ProjectWithEsProjReference/Lib.esproj | 1 + .../package-lock.json | 13 +++++++++++++ .../ProjectWithEsProjReference/package.json | 11 +++++++++++ .../GivenDotnetWorkloadRestore.cs | 18 ++++++++++++++++++ 5 files changed, 53 insertions(+) create mode 100644 test/TestAssets/TestProjects/ProjectWithEsProjReference/App.csproj create mode 100644 test/TestAssets/TestProjects/ProjectWithEsProjReference/Lib.esproj create mode 100644 test/TestAssets/TestProjects/ProjectWithEsProjReference/package-lock.json create mode 100644 test/TestAssets/TestProjects/ProjectWithEsProjReference/package.json diff --git a/test/TestAssets/TestProjects/ProjectWithEsProjReference/App.csproj b/test/TestAssets/TestProjects/ProjectWithEsProjReference/App.csproj new file mode 100644 index 000000000000..520fa8e675c7 --- /dev/null +++ b/test/TestAssets/TestProjects/ProjectWithEsProjReference/App.csproj @@ -0,0 +1,10 @@ + + + + net9.0 + + + + + + diff --git a/test/TestAssets/TestProjects/ProjectWithEsProjReference/Lib.esproj b/test/TestAssets/TestProjects/ProjectWithEsProjReference/Lib.esproj new file mode 100644 index 000000000000..b20505a4fe4a --- /dev/null +++ b/test/TestAssets/TestProjects/ProjectWithEsProjReference/Lib.esproj @@ -0,0 +1 @@ + diff --git a/test/TestAssets/TestProjects/ProjectWithEsProjReference/package-lock.json b/test/TestAssets/TestProjects/ProjectWithEsProjReference/package-lock.json new file mode 100644 index 000000000000..0a695be0ca8e --- /dev/null +++ b/test/TestAssets/TestProjects/ProjectWithEsProjReference/package-lock.json @@ -0,0 +1,13 @@ +{ + "name": "lib", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lib", + "version": "1.0.0", + "license": "MIT" + } + } +} diff --git a/test/TestAssets/TestProjects/ProjectWithEsProjReference/package.json b/test/TestAssets/TestProjects/ProjectWithEsProjReference/package.json new file mode 100644 index 000000000000..2bb37a370104 --- /dev/null +++ b/test/TestAssets/TestProjects/ProjectWithEsProjReference/package.json @@ -0,0 +1,11 @@ +{ + "name": "lib", + "version": "1.0.0", + "description": "A test project to verify .NET SDK compatibility for workload restore and non-Managed projects", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "MIT" +} \ No newline at end of file diff --git a/test/dotnet-workload-restore.Tests/GivenDotnetWorkloadRestore.cs b/test/dotnet-workload-restore.Tests/GivenDotnetWorkloadRestore.cs index e76f6d5616ae..eabc6de3b5cc 100644 --- a/test/dotnet-workload-restore.Tests/GivenDotnetWorkloadRestore.cs +++ b/test/dotnet-workload-restore.Tests/GivenDotnetWorkloadRestore.cs @@ -10,6 +10,7 @@ public GivenDotnetWorkloadRestore(ITestOutputHelper log) : base(log) } public static string DcProjAssetName = "SolutionWithAppAndDcProj"; + public static string TransitiveReferenceNoWorkloadsAssetName = "ProjectWithEsProjReference"; [Fact] public void ProjectsThatDoNotSupportWorkloadsAreNotInspected() @@ -27,4 +28,21 @@ public void ProjectsThatDoNotSupportWorkloadsAreNotInspected() // if we did try to restore the dcproj in this TestAsset we would fail, so passing means we didn't! .Pass(); } + + [Fact] + public void ProjectsThatDoNotSupportWorkloadsAndAreTransitivelyReferencedDoNotBreakTheBuild() + { + var projectPath = + _testAssetsManager + .CopyTestAsset(TransitiveReferenceNoWorkloadsAssetName) + .WithSource() + .Path; + + new DotnetWorkloadCommand(Log, "restore") + .WithWorkingDirectory(projectPath) + .Execute() + .Should() + // if we did try to restore the esproj in this TestAsset we would fail, so passing means we didn't! + .Pass(); + } }