Skip to content

Commit

Permalink
Enable PrunePackageReference for .NET Core and .NET Standard 2.0 and …
Browse files Browse the repository at this point in the history
…above (#6239)
  • Loading branch information
nkolev92 authored Jan 27, 2025
1 parent 20096ab commit 2b3475a
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/NuGet.Core/NuGet.Build.Tasks/NuGet.targets
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,14 @@ Copyright (c) .NET Foundation. All rights reserved.
</PropertyGroup>

<PropertyGroup>
<RestoreEnablePackagePruning Condition="'$(RestoreEnablePackagePruning)' == ''
AND '$(UsingMicrosoftNETSdk)' == 'true'
AND '$(NuGetExeSkipSdkAnalysisLevelCheck)' != 'true'
AND '$(SdkAnalysisLevel)' != ''
AND $([MSBuild]::VersionGreaterThanOrEquals('$(SdkAnalysisLevel)', '10.0.100'))
AND ('$(TargetFrameworkIdentifier)' == '.NETCoreApp'
OR ('$(TargetFrameworkIdentifier)' == '.NETStandard' AND '$(TargetFrameworkVersion)' != '' AND $([MSBuild]::VersionGreaterThanOrEquals('$(TargetFrameworkVersion)', '2.0'))))"
>true</RestoreEnablePackagePruning>
<RestoreEnablePackagePruning Condition="$(RestoreEnablePackagePruning) == '' ">false</RestoreEnablePackagePruning>
</PropertyGroup>

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

[Theory]
[InlineData("10.0.100", null, "netstandard2.1")]
[InlineData("9.0.100", "true", "netstandard2.1")]
public async Task DotnetRestore_WithNETStandardFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning, string tfm)
{
await DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(sdkAnalysisLevel, restoreEnablePackagePruning, tfm);
}

[Theory]
[InlineData("10.0.100", null)]
[InlineData("9.0.100", "true")]
public async Task DotnetRestore_WithCoreFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning)
{
string tfm = Constants.DefaultTargetFramework.GetShortFolderName();
await DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(sdkAnalysisLevel, restoreEnablePackagePruning, tfm);
}

private async Task DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_EnablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning, string tfm)
{
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}", 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();

// netstandard2.1
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, "netstandard2.1")]
[InlineData("10.0.100", "false", "netstandard2.1")]
public async Task DotnetRestore_WithNETStandard_SDKAnalysisLevelAndRestoreEnablePackagePruning_DisablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning, string tfm)
{
await DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_DisablesPruning(sdkAnalysisLevel, restoreEnablePackagePruning, tfm);
}

[Theory]
[InlineData("9.0.100", null)]
[InlineData("10.0.100", "false")]
public async Task DotnetRestore_WithCoreFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_DisablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning)
{
string tfm = Constants.DefaultTargetFramework.GetShortFolderName();
await DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_DisablesPruning(sdkAnalysisLevel, restoreEnablePackagePruning, tfm);
}

private async Task DotnetRestore_WithFramework_SDKAnalysisLevelAndRestoreEnablePackagePruning_DisablesPruning(string sdkAnalysisLevel, string restoreEnablePackagePruning, string tfm)
{
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}", 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().BeEmpty();
assetsFile.Targets[0].Libraries.Should().Contain(e => e.Name.Equals("X"));
assetsFile.Targets[0].Libraries.Should().Contain(e => e.Name.Equals("Y"));
}

private void AssertRelatedProperty(IList<LockFileItem> items, string path, string related)
{
var item = items.Single(i => i.Path.Equals(path));
Expand Down

0 comments on commit 2b3475a

Please sign in to comment.