From 4f9ee05edfdba57584ff23e8e853481e96ac400a Mon Sep 17 00:00:00 2001
From: "goodolclint-claude[bot]"
<323206664+goodolclint-claude[bot]@users.noreply.github.com>
Date: Wed, 2 Sep 2026 20:44:12 +0000
Subject: [PATCH] refactor: centralize build config and pin the SDK (#156)
(#182)
Adds global.json (10.0 SDK, rollForward latestFeature) so local dev
resolves the same SDK line CI pins in five workflows, instead of
floating to whatever is installed.
Adds Directory.Build.props for LangVersion/Nullable, the two
properties identical across all three csproj (TargetFramework stays
per-project since the test project multi-targets net10.0;net48).
Adds Directory.Packages.props with central package management, moving
every PackageReference version out of the three csproj into one file.
Newtonsoft.Json bumped 13.0.3 -> 13.0.4 in the single place instead of
two independent declarations that could drift. xunit.runner.visualstudio
stays at 4.0.0 (it runs xUnit v1/v2/v3 per its own description; nothing
in the issue's stated xunit 2.9.3 pairing required a downgrade).
Removes the self-referential $(NoWarn) from the Core csproj, a no-op.
Adds an explicit System.Memory 4.6.3 PackageReference to the net48
leg of the test project, which resolves the MSB3277 conflict between
System.Memory 4.0.1.2 and 4.0.5.0 (110 warnings -> 0). Scoped to net48
only per the issue, which names only the net48 test target.
Adds PackageVersionCentralizationTests, an xUnit test asserting none
of the three csproj declare a PackageReference Version attribute
outside Directory.Packages.props.
Co-authored-by: goodolclint-claude[bot] <323206664+goodolclint-claude[bot]@users.noreply.github.com>
---
Directory.Build.props | 8 +++
Directory.Packages.props | 19 +++++++
global.json | 6 +++
src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj | 7 +--
src/PSProxmoxVE/PSProxmoxVE.csproj | 6 +--
.../PSProxmoxVE.Core.Tests.csproj | 13 +++--
.../PackageVersionCentralizationTests.cs | 53 +++++++++++++++++++
7 files changed, 96 insertions(+), 16 deletions(-)
create mode 100644 Directory.Build.props
create mode 100644 Directory.Packages.props
create mode 100644 global.json
create mode 100644 tests/PSProxmoxVE.Core.Tests/PackageVersionCentralizationTests.cs
diff --git a/Directory.Build.props b/Directory.Build.props
new file mode 100644
index 0000000..fb9b49e
--- /dev/null
+++ b/Directory.Build.props
@@ -0,0 +1,8 @@
+
+
+
+ 10.0
+ enable
+
+
+
diff --git a/Directory.Packages.props b/Directory.Packages.props
new file mode 100644
index 0000000..dc58746
--- /dev/null
+++ b/Directory.Packages.props
@@ -0,0 +1,19 @@
+
+
+
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/global.json b/global.json
new file mode 100644
index 0000000..512142d
--- /dev/null
+++ b/global.json
@@ -0,0 +1,6 @@
+{
+ "sdk": {
+ "version": "10.0.100",
+ "rollForward": "latestFeature"
+ }
+}
diff --git a/src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj b/src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj
index 8a5eb6f..cfe2021 100644
--- a/src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj
+++ b/src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj
@@ -2,12 +2,9 @@
netstandard2.0
- 10.0
- enable
PSProxmoxVE.Core
PSProxmoxVE.Core
true
- $(NoWarn)
@@ -17,8 +14,8 @@
-
-
+
+
diff --git a/src/PSProxmoxVE/PSProxmoxVE.csproj b/src/PSProxmoxVE/PSProxmoxVE.csproj
index c483096..253c15d 100644
--- a/src/PSProxmoxVE/PSProxmoxVE.csproj
+++ b/src/PSProxmoxVE/PSProxmoxVE.csproj
@@ -2,8 +2,6 @@
netstandard2.0
- 10.0
- enable
PSProxmoxVE
PSProxmoxVE
true
@@ -11,8 +9,8 @@
-
-
+
+
diff --git a/tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj b/tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj
index 8f1b6f7..d5d36e0 100644
--- a/tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj
+++ b/tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj
@@ -2,21 +2,19 @@
net10.0;net48
- 10.0
- enable
false
true
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
@@ -28,6 +26,7 @@
+
diff --git a/tests/PSProxmoxVE.Core.Tests/PackageVersionCentralizationTests.cs b/tests/PSProxmoxVE.Core.Tests/PackageVersionCentralizationTests.cs
new file mode 100644
index 0000000..2a7d70f
--- /dev/null
+++ b/tests/PSProxmoxVE.Core.Tests/PackageVersionCentralizationTests.cs
@@ -0,0 +1,53 @@
+using System;
+using System.IO;
+using System.Linq;
+using System.Xml.Linq;
+using Xunit;
+
+namespace PSProxmoxVE.Core.Tests
+{
+ public class PackageVersionCentralizationTests
+ {
+ private static readonly string[] ProjectPaths =
+ {
+ "src/PSProxmoxVE.Core/PSProxmoxVE.Core.csproj",
+ "src/PSProxmoxVE/PSProxmoxVE.csproj",
+ "tests/PSProxmoxVE.Core.Tests/PSProxmoxVE.Core.Tests.csproj",
+ };
+
+ [Fact]
+ public void PackageReferences_DoNotPinVersionsPerProject()
+ {
+ var repoRoot = FindRepoRoot();
+
+ foreach (var relativePath in ProjectPaths)
+ {
+ var doc = XDocument.Load(Path.Combine(repoRoot, relativePath));
+ var pinned = doc.Descendants("PackageReference")
+ .Where(e => e.Attribute("Version") != null)
+ .Select(e => e.Attribute("Include")?.Value)
+ .ToList();
+
+ Assert.True(pinned.Count == 0,
+ $"{relativePath} pins a version directly instead of going through Directory.Packages.props: {string.Join(", ", pinned)}");
+ }
+ }
+
+ private static string FindRepoRoot()
+ {
+ var dir = new DirectoryInfo(AppContext.BaseDirectory);
+ while (dir != null && !File.Exists(Path.Combine(dir.FullName, "PSProxmoxVE.sln")))
+ {
+ dir = dir.Parent;
+ }
+
+ if (dir == null)
+ {
+ throw new InvalidOperationException(
+ "Could not locate repository root (PSProxmoxVE.sln) from " + AppContext.BaseDirectory);
+ }
+
+ return dir.FullName;
+ }
+ }
+}