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; + } + } +}