Skip to content

Commit 4dbfe0b

Browse files
msz-bdwkl3nk
authored andcommitted
Add support for Central Package Management (CPM)
This means, if you manage common dependencies for many different projects, you can leverage NuGet's Central Package Management (CPM) features to do all of this from a single, central location. Fixes #29. Signed-off-by: klw1imb <wolfgang.klenk2@bosch.com>
1 parent 85abcbe commit 4dbfe0b

File tree

1 file changed

+73
-27
lines changed

1 file changed

+73
-27
lines changed

src/nuget-inspector/ProjectFileProcessor.cs

Lines changed: 73 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.Build.Evaluation;
2+
using NuGet.Build.Tasks;
23
using NuGet.Common;
34
using NuGet.Frameworks;
45
using NuGet.LibraryModel;
@@ -136,6 +137,52 @@ public virtual List<PackageReference> GetPackageReferences()
136137
globalProperties: properties,
137138
toolsVersion: null);
138139

140+
var globalPackageReferences = new List<PackageReference>();
141+
var centralPackageVersions = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
142+
var manageCentrally = project.GetPropertyValue("ManagePackageVersionsCentrally");
143+
if (string.Equals(manageCentrally, "true", StringComparison.OrdinalIgnoreCase))
144+
{
145+
foreach (ProjectItem item in project.GetItems("GlobalPackageReference"))
146+
{
147+
var packageName = item.EvaluatedInclude;
148+
var version = item.GetMetadataValue("Version");
149+
150+
if (!string.IsNullOrWhiteSpace(packageName) && !string.IsNullOrWhiteSpace(version))
151+
{
152+
if (VersionRange.TryParse(version, out var versionRange))
153+
{
154+
var packageRef = new PackageReference(
155+
identity: new PackageIdentity(packageName, null),
156+
targetFramework: ProjectFramework,
157+
userInstalled: false,
158+
developmentDependency: false,
159+
requireReinstallation: false,
160+
allowedVersions: versionRange);
161+
162+
globalPackageReferences.Add(packageRef);
163+
164+
if (Config.TRACE)
165+
Console.WriteLine($" Global package reference: {packageName} = {version}");
166+
}
167+
}
168+
}
169+
references.AddRange(globalPackageReferences);
170+
171+
foreach (ProjectItem item in project.GetItems("PackageVersion"))
172+
{
173+
var packageName = item.EvaluatedInclude;
174+
var version = item.GetMetadataValue("Version");
175+
176+
if (!string.IsNullOrWhiteSpace(packageName) && !string.IsNullOrWhiteSpace(version))
177+
{
178+
centralPackageVersions[packageName] = version;
179+
180+
if (Config.TRACE)
181+
Console.WriteLine($" Central package version: {packageName} = {version}");
182+
}
183+
}
184+
}
185+
139186
foreach (ProjectItem reference in project.GetItems(itemType: "PackageReference"))
140187
{
141188
var name = reference.EvaluatedInclude;
@@ -185,15 +232,32 @@ public virtual List<PackageReference> GetPackageReferences()
185232
continue;
186233
}
187234

188-
var version_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "Version");
235+
ProjectMetadata? version_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "Version");
236+
ProjectMetadata? versionOverride_metadata = reference.Metadata.FirstOrDefault(predicate: meta => meta.Name == "VersionOverride");
189237
VersionRange? version_range;
190-
if (version_metadata is not null)
238+
if (versionOverride_metadata is not null)
239+
{
240+
// VersionOverride takes precedence
241+
VersionRange.TryParse(
242+
versionOverride_metadata.EvaluatedValue,
243+
allowFloating: true,
244+
out version_range);
245+
if (Config.TRACE)
246+
Console.WriteLine($" Applied VersionOverride for {name}: {versionOverride_metadata.EvaluatedValue}");
247+
}
248+
else if (version_metadata is not null)
191249
{
192250
_ = VersionRange.TryParse(
193251
value: version_metadata.EvaluatedValue,
194252
allowFloating: true,
195253
versionRange: out version_range);
196254
}
255+
else if (centralPackageVersions.TryGetValue(name, out var centralVersionString))
256+
{
257+
VersionRange.TryParse(centralVersionString, out version_range);
258+
if (Config.TRACE)
259+
Console.WriteLine($" Applied central version for {name}: {centralVersionString}");
260+
}
197261
else
198262
{
199263
if (Config.TRACE)
@@ -211,31 +275,13 @@ public virtual List<PackageReference> GetPackageReferences()
211275
// }
212276
}
213277

214-
PackageReference packref;
215-
216-
if (version_range == null)
217-
{
218-
if (Config.TRACE)
219-
Console.WriteLine($" Project reference without version range: {name}");
220-
221-
packref = new PackageReference(
222-
identity: new PackageIdentity(id: name, version: null),
223-
targetFramework: ProjectFramework,
224-
userInstalled: false,
225-
developmentDependency: false,
226-
requireReinstallation: false,
227-
allowedVersions: VersionRange.All);
228-
}
229-
else
230-
{
231-
packref = new PackageReference(
232-
identity: new PackageIdentity(id: name, version: null),//(NuGetVersion?)version_range.MinVersion),
233-
targetFramework: ProjectFramework,
234-
userInstalled: false,
235-
developmentDependency: false,
236-
requireReinstallation: false,
237-
allowedVersions: version_range);
238-
}
278+
var packref = new PackageReference(
279+
identity: new PackageIdentity(name, null),
280+
targetFramework: ProjectFramework,
281+
userInstalled: false,
282+
developmentDependency: false,
283+
requireReinstallation: false,
284+
allowedVersions: version_range ?? VersionRange.All);
239285
references.Add(item: packref);
240286

241287
if (Config.TRACE)

0 commit comments

Comments
 (0)