@@ -27,8 +27,59 @@ public class GetPackagesToPrune : TaskBase
27
27
[ Output ]
28
28
public ITaskItem [ ] PackagesToPrune { get ; set ; }
29
29
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
+
30
66
protected override void ExecuteCore ( )
31
67
{
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
+
32
83
var nugetFramework = new NuGetFramework ( TargetFrameworkIdentifier , Version . Parse ( TargetFrameworkVersion ) ) ;
33
84
34
85
Dictionary < string , NuGetVersion > packagesToPrune = new ( ) ;
@@ -57,6 +108,8 @@ protected override void ExecuteCore()
57
108
item . SetMetadata ( "Version" , p . Value . ToString ( ) ) ;
58
109
return item ;
59
110
} ) . ToArray ( ) ;
111
+
112
+ BuildEngine4 . RegisterTaskObject ( key , PackagesToPrune , RegisteredTaskObjectLifetime . Build , true ) ;
60
113
}
61
114
}
62
115
}
0 commit comments