Skip to content

Commit 5994c16

Browse files
committed
Cache results of GetPackagesToPrune
1 parent ce0be21 commit 5994c16

File tree

1 file changed

+53
-0
lines changed

1 file changed

+53
-0
lines changed

src/Tasks/Microsoft.NET.Build.Tasks/GetPackagesToPrune.cs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,59 @@ public class GetPackagesToPrune : TaskBase
2727
[Output]
2828
public ITaskItem[] PackagesToPrune { get; set; }
2929

30+
class CacheKey
31+
{
32+
public string TargetFrameworkIdentifier { get; set; }
33+
public string TargetFrameworkVersion { get; set; }
34+
public HashSet<string> FrameworkReferences { get; set; }
35+
36+
public override bool Equals(object? obj) => obj is CacheKey key &&
37+
TargetFrameworkIdentifier == key.TargetFrameworkIdentifier &&
38+
TargetFrameworkVersion == key.TargetFrameworkVersion &&
39+
FrameworkReferences.SetEquals(key.FrameworkReferences);
40+
public override int GetHashCode()
41+
{
42+
#if NET
43+
var hashCode = new HashCode();
44+
hashCode.Add(TargetFrameworkIdentifier);
45+
hashCode.Add(TargetFrameworkVersion);
46+
foreach (var frameworkReference in FrameworkReferences)
47+
{
48+
hashCode.Add(frameworkReference);
49+
}
50+
return hashCode.ToHashCode();
51+
#else
52+
int hashCode = 1436330440;
53+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(TargetFrameworkIdentifier);
54+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(TargetFrameworkVersion);
55+
56+
foreach (var frameworkReference in FrameworkReferences)
57+
{
58+
hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(frameworkReference);
59+
}
60+
return hashCode;
61+
#endif
62+
}
63+
}
64+
65+
3066
protected override void ExecuteCore()
3167
{
68+
CacheKey key = new()
69+
{
70+
TargetFrameworkIdentifier = TargetFrameworkIdentifier,
71+
TargetFrameworkVersion = TargetFrameworkVersion,
72+
FrameworkReferences = FrameworkReferences.Select(i => i.ItemSpec).ToHashSet()
73+
};
74+
75+
// Cache framework package values per build
76+
var existingResult = BuildEngine4.GetRegisteredTaskObject(key, RegisteredTaskObjectLifetime.Build);
77+
if (existingResult != null)
78+
{
79+
PackagesToPrune = (ITaskItem[])existingResult;
80+
return;
81+
}
82+
3283
var nugetFramework = new NuGetFramework(TargetFrameworkIdentifier, Version.Parse(TargetFrameworkVersion));
3384

3485
Dictionary<string, NuGetVersion> packagesToPrune = new();
@@ -57,6 +108,8 @@ protected override void ExecuteCore()
57108
item.SetMetadata("Version", p.Value.ToString());
58109
return item;
59110
}).ToArray();
111+
112+
BuildEngine4.RegisterTaskObject(key, PackagesToPrune, RegisteredTaskObjectLifetime.Build, true);
60113
}
61114
}
62115
}

0 commit comments

Comments
 (0)