diff --git a/src/SourceBuild/content/eng/Versions.props b/src/SourceBuild/content/eng/Versions.props index 6ca67b96190f..6b1f0a0bc63f 100644 --- a/src/SourceBuild/content/eng/Versions.props +++ b/src/SourceBuild/content/eng/Versions.props @@ -32,8 +32,8 @@ 17.12.6 - 6.12.1 - 6.12.1 + 6.13.1 + 6.13.1 9.0.0 9.0.0 diff --git a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.UnifiedBuild.Tasks/WriteSbrpUsageReport.cs b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.UnifiedBuild.Tasks/WriteSbrpUsageReport.cs index baf653674960..bd2e133ac08a 100644 --- a/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.UnifiedBuild.Tasks/WriteSbrpUsageReport.cs +++ b/src/SourceBuild/content/eng/tools/tasks/Microsoft.DotNet.UnifiedBuild.Tasks/WriteSbrpUsageReport.cs @@ -9,6 +9,7 @@ using System.Xml.Linq; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; +using NuGet.LibraryModel; using NuGet.ProjectModel; namespace Microsoft.DotNet.UnifiedBuild.Tasks; @@ -48,8 +49,9 @@ public override bool Execute() { Log.LogMessage($"Scanning for SBRP Package Usage..."); - ReadSbrpPackages("referencePackages", trackTfms: true); - ReadSbrpPackages("textOnlyPackages", trackTfms: false); + ReadSbrpPackages(Path.Combine("referencePackages", "src"), trackTfms: true); + ReadSbrpPackages(Path.Combine("targetPacks", "ILsrc"), trackTfms: false); + ReadSbrpPackages(Path.Combine("textOnlyPackages", "src"), trackTfms: false); ScanProjectReferences(); @@ -110,11 +112,10 @@ private void PurgeNonReferencedReferences() private IEnumerable GetUnreferencedSbrps() => _sbrpPackages.Values.Where(pkg => pkg.References.Count == 0); - private string GetSbrpPackagesPath(string packageType) => Path.Combine(SbrpRepoSrcPath, packageType, "src"); - - private void ReadSbrpPackages(string packageType, bool trackTfms) + private void ReadSbrpPackages(string packageSrcRelativePath, bool trackTfms) { - foreach (string projectPath in Directory.GetFiles(GetSbrpPackagesPath(packageType), "*.csproj", SearchOption.AllDirectories)) + string packageSrcPath = Path.Combine(SbrpRepoSrcPath, packageSrcRelativePath); + foreach (string projectPath in Directory.GetFiles(packageSrcPath, "*.csproj", SearchOption.AllDirectories)) { DirectoryInfo? directory = Directory.GetParent(projectPath); string version = directory!.Name; @@ -163,28 +164,40 @@ private void ScanProjectReferences() LockFile lockFile = new LockFileFormat().Read(projectJsonFile); foreach (LockFileTargetLibrary lib in lockFile.Targets.SelectMany(t => t.Libraries)) { - if (!_sbrpPackages.TryGetValue(PackageInfo.GetId(lib.Name, lib.Version?.ToString()), out PackageInfo? info)) - { - continue; - } - - if (!info.References.TryGetValue(lockFile.Path, out HashSet? referencedTfms)) - { - referencedTfms = []; - info.References.Add(lockFile.Path, referencedTfms); - } - IEnumerable tfms = lib.CompileTimeAssemblies .Where(asm => asm.Path.StartsWith("lib") || asm.Path.StartsWith("ref")) .Select(asm => asm.Path.Split('/')[1]); - foreach (string tfm in tfms) - { - referencedTfms.Add(tfm); - } + + TrackPackageReference(lockFile.Path, lib.Name, lib.Version?.ToString(), tfms); + } + + foreach (DownloadDependency downloadDep in lockFile.PackageSpec.TargetFrameworks.SelectMany(fx => fx.DownloadDependencies)) + { + TrackPackageReference(lockFile.Path, downloadDep.Name, downloadDep.VersionRange.MinVersion?.ToString(), Enumerable.Empty()); } } } + private void TrackPackageReference(string lockFilePath, string? name, string? version, IEnumerable tfms) + { + string id = PackageInfo.GetId(name, version); + if (!_sbrpPackages.TryGetValue(id, out PackageInfo? info)) + { + return; + } + + if (!info.References.TryGetValue(lockFilePath, out HashSet? referencedTfms)) + { + referencedTfms = []; + info.References.Add(lockFilePath, referencedTfms); + } + + foreach (string tfm in tfms) + { + referencedTfms!.Add(tfm); + } + } + private record PackageInfo(string Name, string Version, string Path, HashSet? Tfms = default) { public string Id => GetId(Name, Version);