handle single project target

This commit is contained in:
Matt Parker
2025-11-02 16:03:01 +10:00
parent c520b37c90
commit 203dbe2163

View File

@@ -82,45 +82,46 @@ public static class ProjectEvaluation
var packages = new List<InstalledPackage>(); var packages = new List<InstalledPackage>();
var dependencyMap = NugetDependencyGraph.GetPackageDependencyMap(assetsFile); var dependencyMap = NugetDependencyGraph.GetPackageDependencyMap(assetsFile);
foreach (var target in assetsFile.Targets.Where(t => t.RuntimeIdentifier == null)) // We currently do not handle multi-targeted projects
var target = assetsFile.Targets.SingleOrDefault(t => t.RuntimeIdentifier == null);
if (target == null) return packages;
var tfm = target.TargetFramework.GetShortFolderName();
var tfmInfo = assetsFile.PackageSpec.TargetFrameworks
.FirstOrDefault(t => t.FrameworkName.Equals(target.TargetFramework));
if (tfmInfo == null) return packages;
var topLevelDependencies = tfmInfo.Dependencies
.DistinctBy(s => s.Name)
.Select(s => s.Name)
.ToHashSet();
foreach (var lockFileTargetLibrary in target.Libraries.Where(l => l.Type == "package"))
{ {
var tfm = target.TargetFramework.GetShortFolderName(); var isTopLevel = topLevelDependencies.Contains(lockFileTargetLibrary.Name);
var tfmInfo = assetsFile.PackageSpec.TargetFrameworks if (!includeTransitive && !isTopLevel) continue;
.FirstOrDefault(t => t.FrameworkName.Equals(target.TargetFramework));
if (tfmInfo == null) continue; var dependency = tfmInfo.Dependencies
.FirstOrDefault(d => d.Name.Equals(lockFileTargetLibrary.Name, StringComparison.OrdinalIgnoreCase));
var topLevelDependencies = tfmInfo.Dependencies var dependents = dependencyMap.GetValueOrDefault(lockFileTargetLibrary.Name, []);
.DistinctBy(s => s.Name) var mappedDependents = dependents.Select(d => new DependentPackage
.Select(s => s.Name)
.ToHashSet();
foreach (var lockFileTargetLibrary in target.Libraries.Where(l => l.Type == "package"))
{ {
var isTopLevel = topLevelDependencies.Contains(lockFileTargetLibrary.Name); PackageName = d.PackageName,
if (!includeTransitive && !isTopLevel) continue; RequestedVersion = d.PackageDependency.VersionRange
}).ToList();
var dependency = tfmInfo.Dependencies packages.Add(new InstalledPackage
.FirstOrDefault(d => d.Name.Equals(lockFileTargetLibrary.Name, StringComparison.OrdinalIgnoreCase)); {
Name = lockFileTargetLibrary.Name,
var dependents = dependencyMap.GetValueOrDefault(lockFileTargetLibrary.Name, []); RequestedVersion = dependency?.LibraryRange.VersionRange?.ToString() ?? "",
var mappedDependents = dependents.Select(d => new DependentPackage ResolvedVersion = lockFileTargetLibrary.Version?.ToString(),
{ TargetFramework = tfm,
PackageName = d.PackageName, IsTopLevel = isTopLevel,
RequestedVersion = d.PackageDependency.VersionRange IsAutoReferenced = dependency?.AutoReferenced ?? false,
}).ToList(); DependentPackages = mappedDependents
});
packages.Add(new InstalledPackage
{
Name = lockFileTargetLibrary.Name,
RequestedVersion = dependency?.LibraryRange.VersionRange?.ToString() ?? "",
ResolvedVersion = lockFileTargetLibrary.Version?.ToString(),
TargetFramework = tfm,
IsTopLevel = isTopLevel,
IsAutoReferenced = dependency?.AutoReferenced ?? false,
DependentPackages = mappedDependents
});
}
} }
return packages; return packages;