diff --git a/src/nuget-inspector/LockFileHelper.cs b/src/nuget-inspector/LockFileHelper.cs index 0257804c..3449295f 100644 --- a/src/nuget-inspector/LockFileHelper.cs +++ b/src/nuget-inspector/LockFileHelper.cs @@ -1,4 +1,5 @@ -using NuGet.ProjectModel; +using System.Diagnostics.CodeAnalysis; +using NuGet.ProjectModel; using NuGet.Versioning; namespace NugetInspector; @@ -143,9 +144,16 @@ public DependencyResolution Process() { foreach (var dependency in dependency_group.Dependencies) { - var project_dependency = ParseProjectFileDependencyGroup(project_file_dependency: dependency); - var library_version = GetBestLibraryVersion(name: project_dependency.GetName(), - range: project_dependency.GetVersionRange(), libraries: ProjectLockFile.Libraries); + // if it is an external reference (not another project), we should find a reference in the + // framework dependencies + if( !TryGetPackageDependency( dependency_group, dependency, out var project_dependency )) + project_dependency = ParseProjectFileDependencyGroup(project_file_dependency: dependency); + + var library_version = GetBestLibraryVersion( + name: project_dependency.GetName(), + range: project_dependency.GetVersionRange(), + libraries: ProjectLockFile.Libraries); + string? version = null; if (library_version != null) { @@ -164,6 +172,34 @@ public DependencyResolution Process() return resolution; } + /// + /// If the framework dependencies contain a matching package, use that version range. + /// + private bool TryGetPackageDependency( + ProjectFileDependencyGroup dependency_group, + string dependency, + [NotNullWhen(true)] out ProjectFileDependency? package_dependency ) + { + package_dependency = null; + var package_id = dependency.Split(' ')[0]; + var target_framework_information = ProjectLockFile + .PackageSpec + ?.TargetFrameworks + ?.Where(x => x.FrameworkName.ToString().Equals(dependency_group.FrameworkName)); + if (target_framework_information?.FirstOrDefault() is not { } framework) + return package_dependency != null; + + var framework_dependency = framework + .Dependencies + .FirstOrDefault(x => x.Name.Equals(package_id, StringComparison.InvariantCultureIgnoreCase)); + var range = framework_dependency?.LibraryRange.VersionRange; + + if (range != null) + package_dependency = new ProjectFileDependency(package_id, range); + + return package_dependency != null; + } + /// /// Parse a ProjectFile DependencyGroup ///