diff --git a/src/Package/build/ReferenceTrimmer.targets b/src/Package/build/ReferenceTrimmer.targets
index 18a6d36..4220bba 100644
--- a/src/Package/build/ReferenceTrimmer.targets
+++ b/src/Package/build/ReferenceTrimmer.targets
@@ -47,9 +47,21 @@
+
-
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Tasks/CollectDeclaredReferencesTask.cs b/src/Tasks/CollectDeclaredReferencesTask.cs
index 061d725..425d624 100644
--- a/src/Tasks/CollectDeclaredReferencesTask.cs
+++ b/src/Tasks/CollectDeclaredReferencesTask.cs
@@ -71,6 +71,7 @@ public override bool Execute()
// Ignore implicitly defined references (references which are SDK-provided)
if (reference.GetMetadata("IsImplicitlyDefined").Equals("true", StringComparison.OrdinalIgnoreCase))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping Reference '{0}' because it is implicitly defined (SDK-provided)", reference.ItemSpec);
continue;
}
@@ -79,18 +80,21 @@ public override bool Execute()
// so the resulting reference would be unavoidable.
if (targetFrameworkAssemblies.Contains(reference.ItemSpec))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping Reference '{0}' because it is a target framework assembly", reference.ItemSpec);
continue;
}
// Ignore references from packages. Those as handled later.
if (reference.GetMetadata("NuGetPackageId").Length != 0)
{
+ // Logs will be emitted for these references when processing the PackageReferences
continue;
}
// Ignore suppressions
if (IsSuppressed(reference, "RT0001"))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping Reference '{0}' because it is suppressed via NoWarn=\"RT0001\" or ", reference.ItemSpec);
continue;
}
@@ -117,6 +121,7 @@ public override bool Execute()
{
if (referencePath.StartsWith(NuGetPackageRoot, StringComparison.OrdinalIgnoreCase))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping Reference '{0}' because its resolved path '{1}' is under the NuGet package root (likely added by a package's props/targets)", referenceSpec, referencePath);
continue;
}
}
@@ -127,6 +132,10 @@ public override bool Execute()
}
}
}
+ else
+ {
+ Log.LogMessage(MessageImportance.Low, "No References to process");
+ }
if (ProjectReferences != null)
{
@@ -135,6 +144,7 @@ public override bool Execute()
// Ignore suppressions
if (IsSuppressed(projectReference, "RT0002"))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping ProjectReference '{0}' because it is suppressed via NoWarn=\"RT0002\" or ", projectReference.ItemSpec);
continue;
}
@@ -154,6 +164,10 @@ public override bool Execute()
declaredReferences.Add(new DeclaredReference(projectReferenceAssemblyPath, DeclaredReferenceKind.ProjectReference, referenceProjectFile));
}
}
+ else
+ {
+ Log.LogMessage(MessageImportance.Low, "No ProjectReferences to process");
+ }
if (PackageReferences != null)
{
@@ -163,17 +177,24 @@ public override bool Execute()
// Ignore suppressions
if (IsSuppressed(packageReference, "RT0003"))
{
+ Log.LogMessage(MessageImportance.Low, "Skipping PackageReference '{0}' because it is suppressed via NoWarn=\"RT0003\" or ", packageReference.ItemSpec);
continue;
}
if (!packageInfos.TryGetValue(packageReference.ItemSpec, out PackageInfo packageInfo))
{
// These are likely Analyzers, tools, etc.
+ Log.LogMessage(MessageImportance.Low, "Skipping PackageReference '{0}' because it has no compile-time assemblies (likely an Analyzer, tool, or content-only package)", packageReference.ItemSpec);
continue;
}
if (packageInfo.BuildFiles.Count > 0)
{
+ Log.LogMessage(MessageImportance.Low, "Skipping PackageReference '{0}' because it has build {1} file(s):", packageReference.ItemSpec, packageInfo.BuildFiles.Count);
+ foreach (string buildFile in packageInfo.BuildFiles)
+ {
+ Log.LogMessage(MessageImportance.Low, " Build file: '{0}'", buildFile);
+ }
continue;
}
@@ -183,10 +204,15 @@ public override bool Execute()
}
}
}
+ else
+ {
+ Log.LogMessage(MessageImportance.Low, "No PackageReferences to process");
+ }
if (OutputFile is not null)
{
new DeclaredReferences(declaredReferences).SaveToFile(OutputFile);
+ Log.LogMessage(MessageImportance.Low, "Saved {0} declared references to '{1}'", declaredReferences.Count, OutputFile);
}
}
finally
@@ -201,14 +227,17 @@ private Dictionary GetPackageInfos()
{
var packageInfoBuilders = new Dictionary(StringComparer.OrdinalIgnoreCase);
+ Log.LogMessage(MessageImportance.Low, "Loading lock file from '{0}'", ProjectAssetsFile);
var lockFile = LockFileUtilities.GetLockFile(ProjectAssetsFile, NullLogger.Instance);
var packageFolders = lockFile.PackageFolders.Select(item => item.Path).ToList();
+ Log.LogMessage(MessageImportance.Low, "Package folders: {0}", string.Join("; ", packageFolders));
LockFileTarget? nugetTarget = null;
if (!string.IsNullOrEmpty(TargetFrameworkMoniker))
{
var nugetFramework = NuGetFramework.ParseComponents(TargetFrameworkMoniker!, TargetPlatformMoniker);
nugetTarget = lockFile.GetTarget(nugetFramework, RuntimeIdentifier);
+ Log.LogMessage(MessageImportance.Low, "Resolved NuGet target framework: '{0}'", nugetFramework);
}
List nugetLibraries;
@@ -217,10 +246,12 @@ private Dictionary GetPackageInfos()
nugetLibraries = nugetTarget.Libraries
.Where(nugetLibrary => string.Equals(nugetLibrary.Type, "Package", StringComparison.OrdinalIgnoreCase))
.ToList();
+ Log.LogMessage(MessageImportance.Low, "Found {0} NuGet package library(ies) in lock file target", nugetLibraries.Count);
}
else
{
nugetLibraries = new List();
+ Log.LogMessage(MessageImportance.Low, "No NuGet target libraries found in lock file");
}
// Compute the hierarchy of packages.
@@ -268,6 +299,7 @@ private Dictionary GetPackageInfos()
{
// This can happen if the project has a stale lock file.
// Just ignore it as NuGet itself will likely error.
+ Log.LogMessage(MessageImportance.Low, "Package '{0}' could not be found in any package folder (stale lock file?). Skipping.", nugetLibrary.Name);
continue;
}
@@ -289,6 +321,14 @@ private Dictionary GetPackageInfos()
.Select(path => Path.Combine(nugetLibraryAbsolutePath, path))
.ToList();
+ if (packageToIgnoreBuildFiles.Contains(nugetLibrary.Name) && nugetLibrary.Build.Count > 0)
+ {
+ Log.LogMessage(MessageImportance.Low, "Package '{0}' has {1} build file(s) but they are ignored via IgnorePackageBuildFiles", nugetLibrary.Name, nugetLibrary.Build.Count);
+ }
+
+ Log.LogMessage(MessageImportance.Low, "Package '{0}' v{1}: {2} compile-time assembly(ies), {3} build file(s)",
+ nugetLibrary.Name, nugetLibrary.Version, nugetLibraryAssemblies.Count, buildFiles.Count);
+
// Add this package's assets, if there are any
if (nugetLibraryAssemblies.Count > 0 || buildFiles.Count > 0)
{
@@ -344,11 +384,13 @@ private HashSet GetTargetFrameworkAssemblyNames()
// See: https://github.com/dotnet/sdk/blob/main/src/Tasks/Common/ConflictResolution/FrameworkListReader.cs
if (TargetFrameworkDirectories != null)
{
+ Log.LogMessage(MessageImportance.Low, "Scanning {0} TargetFrameworkDirectory(ies) for framework assemblies", TargetFrameworkDirectories.Length);
foreach (ITaskItem targetFrameworkDirectory in TargetFrameworkDirectories)
{
string frameworkListPath = Path.Combine(targetFrameworkDirectory.ItemSpec, "RedistList", "FrameworkList.xml");
if (!File.Exists(frameworkListPath))
{
+ Log.LogMessage(MessageImportance.Low, "FrameworkList.xml not found at '{0}'", frameworkListPath);
continue;
}
@@ -388,8 +430,13 @@ private HashSet GetTargetFrameworkAssemblyNames()
string nugetProjectModelFile = Path.Combine(Path.GetDirectoryName(NuGetRestoreTargets)!, assemblyName.Name + ".dll");
if (File.Exists(nugetProjectModelFile))
{
+ Log.LogMessage(MessageImportance.Low, "Resolved assembly '{0}' from '{1}'", assemblyName.Name, nugetProjectModelFile);
return Assembly.LoadFrom(nugetProjectModelFile);
}
+ else
+ {
+ Log.LogMessage(MessageImportance.Low, "Could not resolve assembly '{0}' - file not found at '{1}'", assemblyName.Name, nugetProjectModelFile);
+ }
}
return null;