diff --git a/src/Package/build/ReferenceTrimmer.targets b/src/Package/build/ReferenceTrimmer.targets
index 393076d..0cf944b 100644
--- a/src/Package/build/ReferenceTrimmer.targets
+++ b/src/Package/build/ReferenceTrimmer.targets
@@ -3,18 +3,22 @@
- $(CoreCompileDependsOn);CollectDeclaredReferences
+ $(CoreCompileDependsOn);_StabilizeCollectDeclaredReferences
-
+
- <_ReferenceTrimmerDeclaredReferencesFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_DeclaredReferences.tsv'))
+ <_ReferenceTrimmerDeclaredReferencesFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_DeclaredReferences.raw.tsv'))
<_ReferenceTrimmerUsedReferencesFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_UsedReferences.log'))
<_ReferenceTrimmerUnusedReferencesFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_UnusedReferences.log'))
+ <_ReferenceTrimmerCollectInputsCacheFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_CollectDeclaredReferences.cache'))
+ <_ReferenceTrimmerStableDeclaredReferencesFile>$([System.IO.Path]::GetFullPath('$(IntermediateOutputPath)_ReferenceTrimmer_DeclaredReferences.tsv'))
+ <_CollectDeclaredReferencesHashInputs Include="@(_ReferenceTrimmerReferences -> 'REF=%(Identity)')" />
+ <_CollectDeclaredReferencesHashInputs Include="@(PackageReference -> 'PKG=%(Identity)')" />
+ <_CollectDeclaredReferencesHashInputs Include="@(ReferenceTrimmerIgnorePackageBuildFiles -> 'IGN=%(Identity)')" />
+ <_CollectDeclaredReferencesHashInputs Include="TFM=$(ReferringTargetFrameworkForProjectReferences)" />
+ <_CollectDeclaredReferencesHashInputs Include="TPM=$(TargetPlatformMoniker)" />
+ <_CollectDeclaredReferencesHashInputs Include="RID=$(RuntimeIdentifier)" />
+ <_CollectDeclaredReferencesHashInputs Include="NPR=$(NuGetPackageRoot)" />
+
+
+
+
+
+
+
+
+
+
+ <_CollectDeclaredReferencesInputs Include="$(ProjectAssetsFile)" Condition="Exists('$(ProjectAssetsFile)')" />
+ <_CollectDeclaredReferencesInputs Include="@(_ReferenceTrimmerResolvedReferences)" />
+ <_CollectDeclaredReferencesInputs Include="@(_ReferenceTrimmerProjectReferences)" />
+
+ <_CollectDeclaredReferencesInputs Include="$(_ReferenceTrimmerCollectInputsCacheFile)" />
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+ Condition="'$(EnableReferenceTrimmer)' != 'false'">
+
+
+
+
-
+
diff --git a/src/Tasks/CollectDeclaredReferencesTask.cs b/src/Tasks/CollectDeclaredReferencesTask.cs
index 00e3c6a..63ed8f4 100644
--- a/src/Tasks/CollectDeclaredReferencesTask.cs
+++ b/src/Tasks/CollectDeclaredReferencesTask.cs
@@ -1,5 +1,4 @@
using System.Reflection;
-using System.Text;
using System.Xml.Linq;
using Microsoft.Build.Framework;
using NuGet.Common;
@@ -30,9 +29,6 @@ public sealed class CollectDeclaredReferencesTask : MSBuildTask
[Required]
public string? OutputFile { get; set; }
- [Required]
- public string? MSBuildProjectFile { get; set; }
-
public ITaskItem[]? References { get; set; }
public ITaskItem[]? ResolvedReferences { get; set; }
@@ -482,11 +478,11 @@ private static void SaveDeclaredReferences(IReadOnlyList decl
{
const char fieldDelimiter = '\t';
- StringBuilder writer = new();
+ using StreamWriter writer = new(filePath);
foreach (DeclaredReference reference in declaredReferences)
{
- writer.Append(reference.AssemblyPath);
- writer.Append(fieldDelimiter);
+ writer.Write(reference.AssemblyPath);
+ writer.Write(fieldDelimiter);
string kindString = reference.Kind switch
{
DeclaredReferenceKind.Reference => nameof(DeclaredReferenceKind.Reference),
@@ -494,23 +490,10 @@ private static void SaveDeclaredReferences(IReadOnlyList decl
DeclaredReferenceKind.PackageReference => nameof(DeclaredReferenceKind.PackageReference),
_ => throw new InvalidDataException($"Unknown reference kind '{reference.Kind}'."),
};
- writer.Append(kindString);
- writer.Append(fieldDelimiter);
- writer.Append(reference.Spec);
- writer.AppendLine();
+ writer.Write(kindString);
+ writer.Write(fieldDelimiter);
+ writer.WriteLine(reference.Spec);
}
-
- string newContent = writer.ToString();
- if (File.Exists(filePath))
- {
- string existing = File.ReadAllText(filePath);
- if (string.Equals(existing, newContent, StringComparison.OrdinalIgnoreCase))
- {
- return;
- }
- }
-
- File.WriteAllText(filePath, newContent);
}
private sealed class PackageInfoBuilder