Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 2 additions & 19 deletions src/NuGet.Core/NuGet.Build.Tasks/NuGet.targets
Original file line number Diff line number Diff line change
Expand Up @@ -80,26 +80,9 @@ Copyright (c) .NET Foundation. All rights reserved.
<NuGetAuditMode Condition=" '$(NuGetAuditMode)' == '' ">direct</NuGetAuditMode>
</PropertyGroup>

<!-- Package pruning is enabled for all projects targeting .NET 10 or greater, including multi-targeted projects. -->
<!-- Package pruning is disabled by default. -->
<PropertyGroup>
<!-- We only set the RestoreEnablePackagePruning default for single TFM projects.
For multi-targeted projects that requires knowing the other inner builds, so we rely on RestorePackagePruningDefault. -->
<RestoreEnablePackagePruning Condition="'$(RestoreEnablePackagePruning)' == ''
AND '$(UsingMicrosoftNETSdk)' == 'true'
AND '$(TargetFrameworks)' == ''
AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true'
AND '$(SdkAnalysisLevel)' != ''
AND $([MSBuild]::VersionGreaterThanOrEquals('$(SdkAnalysisLevel)', '10.0.100'))
AND ('$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(TargetFrameworkVersion)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '10.0')))"
>true</RestoreEnablePackagePruning>
<RestoreEnablePackagePruning Condition="$(RestoreEnablePackagePruning) == '' AND '$(TargetFrameworks)' == ''">false</RestoreEnablePackagePruning>
<RestorePackagePruningDefault Condition="'$(UsingMicrosoftNETSdk)' == 'true'
AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true'
AND '$(SdkAnalysisLevel)' != ''
AND $([MSBuild]::VersionGreaterThanOrEquals('$(SdkAnalysisLevel)', '10.0.100'))
AND ('$(TargetFrameworkIdentifier)' == '.NETCoreApp' AND '$(TargetFrameworkVersion)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '10.0')))"
>true</RestorePackagePruningDefault>
<RestorePackagePruningDefault Condition="'$(RestorePackagePruningDefault)' == ''">false</RestorePackagePruningDefault>
<RestoreEnablePackagePruning Condition="$(RestoreEnablePackagePruning) == ''">false</RestoreEnablePackagePruning>
</PropertyGroup>

<PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3067,62 +3067,6 @@ public async Task DotnetRestore_WithConditionalPrunedPackageReference_Succeeds(b
assetsFile.Targets[1].Libraries.Should().NotContain(e => e.Name.Equals("Y"));
}

[Theory]
[InlineData("10.0.100", null, true)]
[InlineData("9.0.100", "true", true)]
[InlineData("10.0.100", null, false)]
[InlineData("9.0.100", "true", false)]
public async Task DotnetRestore_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning, bool useStaticGraphRestore)
{
string tfm = Constants.DefaultTargetFramework.GetShortFolderName();
using SimpleTestPathContext pathContext = _dotnetFixture.CreateSimpleTestPathContext();
var projectName = "ClassLibrary1";
var workingDirectory = Path.Combine(pathContext.SolutionRoot, projectName);
var projectFile = Path.Combine(workingDirectory, $"{projectName}.csproj");
await SimpleTestPackageUtility.CreatePackagesAsync(pathContext.PackageSource, new SimpleTestPackageContext("X", "1.0.0") { Dependencies = [new SimpleTestPackageContext("Y", "1.0.0")] });

_dotnetFixture.CreateDotnetNewProject(pathContext.SolutionRoot, projectName, "classlib -f netstandard2.1", testOutputHelper: _testOutputHelper);

using (var stream = File.Open(projectFile, FileMode.Open, FileAccess.ReadWrite))
{
var xml = XDocument.Load(stream);
ProjectFileUtils.SetTargetFrameworkForProject(xml, "TargetFramework", tfm);
ProjectFileUtils.AddProperty(xml, "SdkAnalysisLevel", sdkAnalysisLevel);
if (!string.IsNullOrEmpty(restoreEnablePackagePruning))
{
ProjectFileUtils.AddProperty(xml, "RestoreEnablePackagePruning", restoreEnablePackagePruning);
}
ProjectFileUtils.AddItem(
xml,
"PackageReference",
"X",
string.Empty,
[],
new Dictionary<string, string>() { { "Version", "1.0.0" } });

ProjectFileUtils.AddItem(
xml,
"PrunePackageReference",
"Y",
string.Empty,
[],
new Dictionary<string, string>() { { "Version", "2.0.0" } });

ProjectFileUtils.WriteXmlToFile(xml, stream);
}

var result = _dotnetFixture.RunDotnetExpectSuccess(workingDirectory, $"restore {projectFile} {(useStaticGraphRestore ? " /p:RestoreUseStaticGraphEvaluation=true" : string.Empty)}", testOutputHelper: _testOutputHelper);
result.AllOutput.Should().NotContain("Warning");
string assetsFilePath = Path.Combine(workingDirectory, "obj", LockFileFormat.AssetsFileName);
LockFile assetsFile = new LockFileFormat().Read(assetsFilePath);
assetsFile.Targets.Should().HaveCount(1);
assetsFile.PackageSpec.TargetFrameworks.Should().HaveCount(1);
assetsFile.PackageSpec.TargetFrameworks[0].TargetAlias.Should().Be(tfm);
assetsFile.PackageSpec.TargetFrameworks[0].PackagesToPrune.Should().NotBeEmpty();
assetsFile.Targets[0].Libraries.Should().Contain(e => e.Name.Equals("X"));
assetsFile.Targets[0].Libraries.Should().NotContain(e => e.Name.Equals("Y"));
}

[Theory]
[InlineData("9.0.100", null)]
[InlineData("10.0.100", "false")]
Expand Down Expand Up @@ -3178,23 +3122,6 @@ public async Task DotnetRestore_SDKAnalysisLevelAndRestoreEnablePackagePruning_D
assetsFile.Targets[0].Libraries.Should().Contain(e => e.Name.Equals("Y"));
}

[Theory]
[InlineData(true)]
[InlineData(false)]
public async Task DotnetRestore_WithMultiTargetedProjectAndSDKAnalysisLevel_EnablesForAllFrameworks(bool useStaticGraphRestore)
{
using SimpleTestPathContext pathContext = _dotnetFixture.CreateSimpleTestPathContext();
LockFile assetsFile = await DotnetRestore_MultiTargetedProjectWithSDKAnalysisLevel(pathContext, "10.0.100", useStaticGraphRestore);

assetsFile.PackageSpec.TargetFrameworks[0].PackagesToPrune.Should().NotBeEmpty();
assetsFile.Targets[0].Libraries.Should().Contain(e => e.Name.Equals("X"));
assetsFile.Targets[0].Libraries.Should().NotContain(e => e.Name.Equals("Y"));

assetsFile.PackageSpec.TargetFrameworks[1].PackagesToPrune.Should().NotBeEmpty();
assetsFile.Targets[1].Libraries.Should().Contain(e => e.Name.Equals("X"));
assetsFile.Targets[1].Libraries.Should().NotContain(e => e.Name.Equals("Y"));
}

[Theory]
[InlineData(true)]
[InlineData(false)]
Expand Down Expand Up @@ -3308,6 +3235,7 @@ private async Task<LockFile> DotnetRestore_MultiTargetedProjectWithRestoreEnable
{
var xml = XDocument.Load(stream);
ProjectFileUtils.SetTargetFrameworkForProject(xml, "TargetFrameworks", $"{tfm};netstandard2.1");
ProjectFileUtils.AddProperty(xml, "RestoreEnablePackagePruning", "true");
if (!string.IsNullOrEmpty(restoreEnablePackagePruning))
{
ProjectFileUtils.AddProperty(xml, "RestoreEnablePackagePruning", restoreEnablePackagePruning, condition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ public void NuGetAuditModeDefaults(string SdkAnalysisLevel, string UsingMicrosof

[Theory]
// .NET (Core) SDK 10.0
[InlineData("10.0.100", "net10.0", "true")]
[InlineData("10.0.100", "net10.0", "false")]
[InlineData("10.0.100", "net9.0", "false")]
[InlineData("10.0.100", "net8.0", "false")]
[InlineData("10.0.100", "net7.0", "false")]
Expand Down Expand Up @@ -106,59 +106,5 @@ public void PackagePruningDefaults_RestoreEnablePackagePruning(string SdkAnalysi
// Assert
resultText.Should().Be(expected);
}

[Theory]
// .NET (Core) SDK 10.0
[InlineData("10.0.100", "net10.0", "true")]
[InlineData("10.0.100", "net9.0", "false")]
[InlineData("10.0.100", "net8.0", "false")]
[InlineData("10.0.100", "net7.0", "false")]
[InlineData("10.0.100", "net6.0", "false")]
[InlineData("10.0.100", "net5.0", "false")]
[InlineData("10.0.100", "netcoreapp3.1", "false")]
[InlineData("10.0.100", "netcoreapp3.0", "false")]
[InlineData("10.0.100", "netcoreapp2.2", "false")]
[InlineData("10.0.100", "netcoreapp2.1", "false")]
[InlineData("10.0.100", "netcoreapp2.0", "false")]
[InlineData("10.0.100", "netcoreapp1.1", "false")]
[InlineData("10.0.100", "netcoreapp1.0", "false")]
// .NET Standard SDK 10.0
[InlineData("10.0.100", "netstandard2.1", "false")]
[InlineData("10.0.100", "netstandard2.0", "false")]
[InlineData("10.0.100", "netstandard1.6", "false")]
// .NET Framework SDK 10.0
[InlineData("10.0.100", "net48", "false")]
// SDK 10.0
[InlineData("9.0.100", "net10.0", "false")]
[InlineData("9.0.100", "net9.0", "false")]
[InlineData("9.0.100", "net8.0", "false")]
[InlineData("9.0.100", "netstandard2.1", "false")]
[InlineData("9.0.100", "netstandard2.0", "false")]
public void PackagePruningDefaults_RestorePackagePruningDefault(string SdkAnalysisLevel, string targetFramework, string expected)
{
// Arrange
using var testDirectory = TestDirectory.Create();

string projectText = @"<Project>
<Import Project=""$(NuGetRestoreTargets)"" />
</Project>";
var projectFilePath = Path.Combine(testDirectory, "my.proj");
File.WriteAllText(projectFilePath, projectText);

string args = $"{projectFilePath} -getProperty:RestorePackagePruningDefault";
if (!string.IsNullOrEmpty(SdkAnalysisLevel)) args += $" -p:SdkAnalysisLevel={SdkAnalysisLevel}";

var framework = NuGetFramework.Parse(targetFramework);
args += $" -p:TargetFrameworkIdentifier={framework.Framework}";
args += $" -p:TargetFrameworkVersion={framework.Version}";
args += $" -p:UsingMicrosoftNETSdk=true";

// Act
var result = _fixture.RunMsBuild(testDirectory, args);
var resultText = result.Output.Trim();

// Assert
resultText.Should().Be(expected);
}
}
}