Skip to content

Commit 1f96f66

Browse files
authored
Merge pull request #72 from boschglobal/issue/29-central-package-version-management
Add support for Central Package Management (CPM)
2 parents 85abcbe + f8bcd6f commit 1f96f66

5 files changed

Lines changed: 663 additions & 27 deletions

File tree

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)
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<Project>
2+
3+
<PropertyGroup>
4+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<!-- GlobalPackageReference: applied to all projects automatically -->
9+
<GlobalPackageReference Include="MinVer" Version="4.2.0" />
10+
</ItemGroup>
11+
12+
<ItemGroup>
13+
<!-- PackageVersion: central version definitions used by projects without a version -->
14+
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
15+
<!-- System.Text.Json: central version is 7.0.3, but the project will override it -->
16+
<PackageVersion Include="System.Text.Json" Version="7.0.3" />
17+
</ItemGroup>
18+
19+
</Project>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net6.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<!-- Version resolved from central Directory.Packages.props (PackageVersion 13.0.3) -->
9+
<PackageReference Include="Newtonsoft.Json" />
10+
<!-- VersionOverride takes precedence over the central version of 7.0.3 -->
11+
<PackageReference Include="System.Text.Json">
12+
<VersionOverride>6.0.9</VersionOverride>
13+
</PackageReference>
14+
</ItemGroup>
15+
16+
</Project>

0 commit comments

Comments
 (0)