Repository navigation
Split tool wrappers out of Fallout.Common into per-tool projects + NuGet packages #72
Description
Problem
Fallout.Common is a kitchen sink. It contains:
- Framework basics (
FalloutBuild,Target, parameter injection, etc.). - ~70 tool wrappers under
src/Fallout.Common/Tools/<Tool>/: DotNet, MSBuild, Docker, Helm, Kubernetes, AzureKeyVault, Xunit, ReportGenerator, GitVersion, Paket, Boots, Chocolatey, … most of which a typical consumer never touches.
Every consumer pays for every tool — bigger compile times, bigger restore graph, transitive deps for tools they don't use.
Goal
Make Fallout.Common a clean base library:
- Each tool wrapper → its own project + NuGet package.
- Consumers add a
PackageReferenceper tool they use. - Third parties can ship
Foo.Fallout.Tools.<Bar>packages on the same architecture without touching this repo. - We keep maintaining a baseline set of officially supported tools.
Naming proposal
Fallout.Tools.<Tool> (e.g. Fallout.Tools.DotNet, Fallout.Tools.Docker, Fallout.Tools.Helm). Mirrors the existing Fallout.Utilities.IO.Compression / .Globbing style.
Layout:
src/
Fallout.Common/ # framework basics only
Fallout.Tools.DotNet/
Fallout.Tools.DotNet.csproj
DotNet.json
DotNet.Generated.cs # regenerated
DotNetTasks.cs # hand-written extras
Fallout.Tools.Docker/
...
Mechanical plan
- New project per tool — references
Fallout.Common(or a narrower base if we slice further). Targetsnet8.0;net9.0;net10.0. - Move
src/Fallout.Common/Tools/<Tool>/→src/Fallout.Tools.<Tool>/, preserving the.json/.Generated.cspairing. - Update the generator: per-project
namespaceProvider: x => $"Fallout.Tools.{x.Name}"instead ofFallout.Common.Tools.{x.Name}. Namespace flattens —Fallout.Common.Tools.DotNet.DotNetTasks→Fallout.Tools.DotNet.DotNetTasks. - Update
fallout.slnx+Directory.Packages.props. - Add per-tool tests under
tests/Fallout.Tools.<Tool>.Tests/. - Roll into the release pipeline so each tool packs separately.
Migration impact
- Breaking for consumers. Add
<PackageReference Include="Fallout.Tools.DotNet" />and updateusing Fallout.Common.Tools.DotNet;→using Fallout.Tools.DotNet;. Both mechanical — fit forfallout-migrate. - Breaking for shim consumers. The
Nuke.Commonshim must either re-export the tool surface fromNuke.Common.Tools.<Tool>namespaces (more wrapper code) or split into matchingNuke.Tools.<Tool>shim packages. - Belongs in 11.0, aligned with the existing FALLOUT001/002/003 deprecation sunsets.
Carve-outs to leave in Fallout.Common
Framework-coupled tools probably stay:
Tools/Git/— used by[GitRepository]injection.Tools/GitHub/— used byICreateGitHubRelease.Tools/GitVersion/— used byIHazGitVersion.Tools/MSBuild/— used byProjectModel.
Borderline:
Tools/DotNet/— used byIPublish,IPack,IRestore,ITest. Probably stays.Tools/NuGet/,Tools/Paket/— adjacent toIPublish. Maybe stays.
Everything else (Docker, Helm, Kubernetes, Xunit, ReportGenerator, AzureKeyVault, …) splits out.
Why filed in Backlog
A significant breaking change with no immediate release pressure. Worth doing alongside other 11.0-aligned breaks (legacy Nuke* MSBuild prop/env-var removal). Listed here so demand can accumulate; promote to a milestone when planning 11.0.
Done when
- Decision recorded on which tools stay (framework-coupled list above) vs split out
- One tool extracted as proof of concept (
Fallout.Tools.Dockeror similar) — exercises generator, packaging, release pipeline, consumer story - Remaining tools migrated (mechanical, after the proof)
-
fallout-migraterewrites the namespace + adds per-tool<PackageReference>entries - Migration guide entry ([P5] Write NUKE → Fallout migration guide #37) covers the split
-
Nuke.Tools.<X>shim packages, orNuke.Commonshim updated to re-export from the new namespaces - Release pipeline ships
Fallout.Tools.<X>packages alongsideFallout.Common
Activity
ChrisonSimtian commentedon May 21, 2026
Now a sub-issue under #73 (umbrella modularization).
dennisdoomen commentedon Oct 10, 2026
What's the real issue you're trying to solve here? In my world, less projects is better. I would only keep separate projects (and packages) if you want to avoid consumers to have to pull in something they don't need. But I don't think that's a problem right now, especially as we release everything together anyway.
ChrisonSimtian commentedon Oct 15, 2026
The idea was to have a clean core project and all the fluff around it comes as plugins/addons.
I thought at the time that this might be a good way for the community to contribute the tools/plugins and we could focus on providing the core framework.
Lets put this one on hold for now, i dont think its a priority for now (hence backlog long tail)