Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 73 additions & 27 deletions src/nuget-inspector/ProjectFileProcessor.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Microsoft.Build.Evaluation;
using NuGet.Build.Tasks;
using NuGet.Common;
using NuGet.Frameworks;
using NuGet.LibraryModel;
Expand Down Expand Up @@ -136,6 +137,52 @@ public virtual List<PackageReference> GetPackageReferences()
globalProperties: properties,
toolsVersion: null);

var globalPackageReferences = new List<PackageReference>();
var centralPackageVersions = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var manageCentrally = project.GetPropertyValue("ManagePackageVersionsCentrally");
if (string.Equals(manageCentrally, "true", StringComparison.OrdinalIgnoreCase))
{
foreach (ProjectItem item in project.GetItems("GlobalPackageReference"))
{
var packageName = item.EvaluatedInclude;
var version = item.GetMetadataValue("Version");

if (!string.IsNullOrWhiteSpace(packageName) && !string.IsNullOrWhiteSpace(version))
{
if (VersionRange.TryParse(version, out var versionRange))
{
var packageRef = new PackageReference(
identity: new PackageIdentity(packageName, null),
targetFramework: ProjectFramework,
userInstalled: false,
developmentDependency: false,
requireReinstallation: false,
allowedVersions: versionRange);

globalPackageReferences.Add(packageRef);

if (Config.TRACE)
Console.WriteLine($" Global package reference: {packageName} = {version}");
}
}
}
references.AddRange(globalPackageReferences);

foreach (ProjectItem item in project.GetItems("PackageVersion"))
{
var packageName = item.EvaluatedInclude;
var version = item.GetMetadataValue("Version");

if (!string.IsNullOrWhiteSpace(packageName) && !string.IsNullOrWhiteSpace(version))
{
centralPackageVersions[packageName] = version;

if (Config.TRACE)
Console.WriteLine($" Central package version: {packageName} = {version}");
}
}
}

foreach (ProjectItem reference in project.GetItems(itemType: "PackageReference"))
{
var name = reference.EvaluatedInclude;
Expand Down Expand Up @@ -185,15 +232,32 @@ public virtual List<PackageReference> GetPackageReferences()
continue;
}

var version_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "Version");
ProjectMetadata? version_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "Version");
ProjectMetadata? versionOverride_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "VersionOverride");
VersionRange? version_range;
if (version_metadata is not null)
if (versionOverride_metadata is not null)
{
// VersionOverride takes precedence
VersionRange.TryParse(
versionOverride_metadata.EvaluatedValue,
allowFloating: true,
out version_range);
if (Config.TRACE)
Console.WriteLine($" Applied VersionOverride for {name}: {versionOverride_metadata.EvaluatedValue}");
}
else if (version_metadata is not null)
{
_ = VersionRange.TryParse(
value: version_metadata.EvaluatedValue,
allowFloating: true,
versionRange: out version_range);
}
else if (centralPackageVersions.TryGetValue(name, out var centralVersionString))
{
VersionRange.TryParse(centralVersionString, out version_range);
if (Config.TRACE)
Console.WriteLine($" Applied central version for {name}: {centralVersionString}");
}
else
{
if (Config.TRACE)
Expand All @@ -211,31 +275,13 @@ public virtual List<PackageReference> GetPackageReferences()
// }
}

PackageReference packref;

if (version_range == null)
{
if (Config.TRACE)
Console.WriteLine($" Project reference without version range: {name}");

packref = new PackageReference(
identity: new PackageIdentity(id: name, version: null),
targetFramework: ProjectFramework,
userInstalled: false,
developmentDependency: false,
requireReinstallation: false,
allowedVersions: VersionRange.All);
}
else
{
packref = new PackageReference(
identity: new PackageIdentity(id: name, version: null),//(NuGetVersion?)version_range.MinVersion),
targetFramework: ProjectFramework,
userInstalled: false,
developmentDependency: false,
requireReinstallation: false,
allowedVersions: version_range);
}
var packref = new PackageReference(
identity: new PackageIdentity(name, null),
targetFramework: ProjectFramework,
userInstalled: false,
developmentDependency: false,
requireReinstallation: false,
allowedVersions: version_range ?? VersionRange.All);
references.Add(item: packref);

if (Config.TRACE)
Expand Down