chore: migrate to .slnx and enable central package management - #576
Merged
Conversation
Solution folders (src, TestHarnesses, Widgets) survive the migration, so the
Nuke [Solution(GenerateProjects = true)] accessors Build.cs depends on
(Solution.src.*, Solution.TestHarnesses.*) keep their generated names.
Two companion changes are required, not optional:
- .nuke/parameters.json pinned the solution by name; every Nuke target fails
at startup without it.
- global.json pinned sdk.version 9.0.100. .slnx restore needs 9.0.200+, so
the old floor could no longer build the repo. rollForward: latestMajor
happened to mask this on CI (which also installs 10.0.x), but relying on
roll-forward to clear a hard floor is not a constraint you want implicit.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Moves all 47 package versions into Directory.Packages.props and strips the
inline Version attributes. Three things here are load-bearing and should not be
"simplified" later:
- Per-TFM versions survive as conditional PackageVersion groups. This works
because Directory.Packages.props is evaluated per inner build, so
$(TargetFramework) is available. JasperFx and JasperFx.RuntimeCompiler each
had two near-identical conditional ItemGroups that collapse to one now that
the version is the only thing that differed.
- Roslyn cannot collapse to one version. RuntimeCompiler tracks the SDK
([4.14.0,6.0.0) / 5.0.0 per TFM), but the two source generators are
netstandard2.0 and must stay pinned low (4.3.0 / 4.8.0) or they won't load
in an older consumer's compiler. They use VersionOverride, as do the
generator test projects that host Roslyn to drive them. Verified post-change
with `dotnet list package` that all four still resolve exactly as before.
The unconditional Roslyn default also exists so the netstandard2.0 projects
resolve at all -- neither TFM condition applies to them, so without it they
hit NU1010.
- build/ opts out via its own Directory.Packages.props. It already isolates
itself from repo MSBuild, but CPM discovery does not follow that isolation
(NuGet walks up independently), so Build.csproj's inline Nuke.Common version
would otherwise fail NU1008.
Five versions were drifting in EventStoreTests alone and are now unified up to
match the rest of the repo: xunit 2.9.2 -> 2.9.3, xunit.runner.visualstudio
2.9.2 -> 3.0.0, NSubstitute 5.1.0 -> 5.3.0, Shouldly 4.2.1 -> 4.3.0,
Microsoft.Extensions.TimeProvider.Testing 9.0.0 -> 9.7.0. That suite is the one
real behavior change in this commit; it passes.
Full suite green, both TFMs: CoreTests 475, CodegenTests 419, CommandLineTests
295, EventTests 648, EventStoreTests 72.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Jul 29, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Groundwork for the xunit 3 migration, but independently useful. Two commits, both infrastructure-only.
1.
jasperfx.sln→jasperfx.slnxSolution folders (
src,TestHarnesses,Widgets) survive migration, so the Nuke[Solution(GenerateProjects = true)]accessorsBuild.csdepends on (Solution.src.*,Solution.TestHarnesses.*) keep their generated names.Two companion changes are required, not optional:
.nuke/parameters.jsonpinned the solution by filename. Every Nuke target fails at startup without updating it.global.jsonpinnedsdk.version: 9.0.100..slnxrestore needs 9.0.200+, so the old floor can no longer build the repo.rollForward: latestMajorhappened to mask this on CI (which also installs 10.0.x), but relying on roll-forward to clear a hard floor shouldn't stay implicit — now pinned to10.0.100.2. Central package management
All 47 package versions move into
Directory.Packages.props. Three things here are load-bearing:Per-TFM versions survive as conditional
PackageVersiongroups —Directory.Packages.propsis evaluated per inner build, so$(TargetFramework)is available.JasperFxandJasperFx.RuntimeCompilereach had two near-identical conditionalItemGroups that collapse to one now that the version was the only difference.Roslyn cannot collapse to one version. Three consumers want three different answers:
JasperFx.RuntimeCompiler[4.14.0,6.0.0)net9 /5.0.0net10JasperFx.SourceGenerator4.3.0(VersionOverride)JasperFx.Events.SourceGenerator4.8.0(VersionOverride)4.8.0(VersionOverride)Verified with
dotnet list packageafter the change that all four still resolve exactly as before. The unconditional Roslyn default also has to exist so the netstandard2.0 projects resolve at all — neither TFM condition applies to them, so without it they hitNU1010.build/opts out via its ownDirectory.Packages.props. It already isolates itself from repo MSBuild viaDirectory.Build.props/.targets, but CPM discovery does not follow that isolation — NuGet walks up independently — soBuild.csproj's inlineNuke.Commonversion would otherwise failNU1008.The one real behavior change
Five versions were drifting in EventStoreTests alone and are now unified up to match the rest of the repo:
xunit2.9.2→2.9.3 ·xunit.runner.visualstudio2.9.2→3.0.0 ·NSubstitute5.1.0→5.3.0 ·Shouldly4.2.1→4.3.0 ·Microsoft.Extensions.TimeProvider.Testing9.0.0→9.7.0That suite is the thing to watch in review. It passes.
Verification
Full suite green on both target frameworks:
Plus
smoke-test-aotand the CLI smoke commands.Incidental finding, not addressed here:
JasperFx.SourceGenerator.Tests(19),JasperFx.Events.SourceGenerator.Tests(26), andJasperFx.Aspire.Tests(51) are in the solution but in no Nuke target and no CI step — 96 tests that compile and never run. All three pass locally. Follow-up PR.🤖 Generated with Claude Code