|
9 | 9 | using System.Xml.Linq;
|
10 | 10 | using Microsoft.Build.Framework;
|
11 | 11 | using Microsoft.Build.Utilities;
|
| 12 | +using NuGet.LibraryModel; |
12 | 13 | using NuGet.ProjectModel;
|
13 | 14 |
|
14 | 15 | namespace Microsoft.DotNet.UnifiedBuild.Tasks;
|
@@ -48,8 +49,9 @@ public override bool Execute()
|
48 | 49 | {
|
49 | 50 | Log.LogMessage($"Scanning for SBRP Package Usage...");
|
50 | 51 |
|
51 |
| - ReadSbrpPackages("referencePackages", trackTfms: true); |
52 |
| - ReadSbrpPackages("textOnlyPackages", trackTfms: false); |
| 52 | + ReadSbrpPackages(Path.Combine("referencePackages", "src"), trackTfms: true); |
| 53 | + ReadSbrpPackages(Path.Combine("targetPacks", "ILsrc"), trackTfms: false); |
| 54 | + ReadSbrpPackages(Path.Combine("textOnlyPackages", "src"), trackTfms: false); |
53 | 55 |
|
54 | 56 | ScanProjectReferences();
|
55 | 57 |
|
@@ -110,11 +112,10 @@ private void PurgeNonReferencedReferences()
|
110 | 112 | private IEnumerable<PackageInfo> GetUnreferencedSbrps() =>
|
111 | 113 | _sbrpPackages.Values.Where(pkg => pkg.References.Count == 0);
|
112 | 114 |
|
113 |
| - private string GetSbrpPackagesPath(string packageType) => Path.Combine(SbrpRepoSrcPath, packageType, "src"); |
114 |
| - |
115 |
| - private void ReadSbrpPackages(string packageType, bool trackTfms) |
| 115 | + private void ReadSbrpPackages(string packageSrcRelativePath, bool trackTfms) |
116 | 116 | {
|
117 |
| - foreach (string projectPath in Directory.GetFiles(GetSbrpPackagesPath(packageType), "*.csproj", SearchOption.AllDirectories)) |
| 117 | + string packageSrcPath = Path.Combine(SbrpRepoSrcPath, packageSrcRelativePath); |
| 118 | + foreach (string projectPath in Directory.GetFiles(packageSrcPath, "*.csproj", SearchOption.AllDirectories)) |
118 | 119 | {
|
119 | 120 | DirectoryInfo? directory = Directory.GetParent(projectPath);
|
120 | 121 | string version = directory!.Name;
|
@@ -163,24 +164,39 @@ private void ScanProjectReferences()
|
163 | 164 | LockFile lockFile = new LockFileFormat().Read(projectJsonFile);
|
164 | 165 | foreach (LockFileTargetLibrary lib in lockFile.Targets.SelectMany(t => t.Libraries))
|
165 | 166 | {
|
166 |
| - if (!_sbrpPackages.TryGetValue(PackageInfo.GetId(lib.Name, lib.Version?.ToString()), out PackageInfo? info)) |
167 |
| - { |
168 |
| - continue; |
169 |
| - } |
170 |
| - |
171 |
| - if (!info.References.TryGetValue(lockFile.Path, out HashSet<string>? referencedTfms)) |
172 |
| - { |
173 |
| - referencedTfms = []; |
174 |
| - info.References.Add(lockFile.Path, referencedTfms); |
175 |
| - } |
176 |
| - |
177 | 167 | IEnumerable<string> tfms = lib.CompileTimeAssemblies
|
178 | 168 | .Where(asm => asm.Path.StartsWith("lib") || asm.Path.StartsWith("ref"))
|
179 | 169 | .Select(asm => asm.Path.Split('/')[1]);
|
180 |
| - foreach (string tfm in tfms) |
181 |
| - { |
182 |
| - referencedTfms.Add(tfm); |
183 |
| - } |
| 170 | + |
| 171 | + TrackPackageReference(lockFile.Path, lib.Name, lib.Version?.ToString(), tfms); |
| 172 | + } |
| 173 | + |
| 174 | + foreach (DownloadDependency downloadDep in lockFile.PackageSpec.TargetFrameworks.SelectMany(fx => fx.DownloadDependencies)) |
| 175 | + { |
| 176 | + TrackPackageReference(lockFile.Path, downloadDep.Name, downloadDep.VersionRange.MinVersion?.ToString(), null); |
| 177 | + } |
| 178 | + } |
| 179 | + } |
| 180 | + |
| 181 | + private void TrackPackageReference(string lockFilePath, string? name, string? version, IEnumerable<string>? tfms) |
| 182 | + { |
| 183 | + string id = PackageInfo.GetId(name, version); |
| 184 | + if (!_sbrpPackages.TryGetValue(id, out PackageInfo? info)) |
| 185 | + { |
| 186 | + return; |
| 187 | + } |
| 188 | + |
| 189 | + if (!info.References.TryGetValue(lockFilePath, out HashSet<string>? referencedTfms)) |
| 190 | + { |
| 191 | + referencedTfms = []; |
| 192 | + info.References.Add(lockFilePath, referencedTfms); |
| 193 | + } |
| 194 | + |
| 195 | + if (tfms != null) |
| 196 | + { |
| 197 | + foreach (string tfm in tfms) |
| 198 | + { |
| 199 | + referencedTfms!.Add(tfm); |
184 | 200 | }
|
185 | 201 | }
|
186 | 202 | }
|
|
0 commit comments