This path starts with a clean checkout and produces a native Windows Installer package. Docker supplies the pinned Zig toolchain, so Windows, Linux, and macOS authors use the same build environment.
Prerequisites
- Git.
- Docker Desktop on Windows or macOS, or Docker Engine with Compose on Linux.
- On Windows, enable Docker Desktop’s WSL 2 backend.
- Enough permission to run containers and write into the checkout.
You do not need WiX, Visual Studio, the .NET SDK, or Windows to create the MSI. Windows is required to run and fully test the finished installer.
1. Build Setupidity
git clone https://gitlab.com/DanOpcode/setupidity.git
cd setupidity
docker compose build build
docker compose run --rm build linux
This produces dist/linux-x86_64/bin/setupidity inside the checkout. The Linux binary runs in the build container regardless of your authoring host.
2. Produce the first MSI
The repository includes a small, non-sensitive payload fixture. Run the tested command from the repository root:
docker compose run --rm build run build `
--id com.example.first-msi `
--name "First MSI" `
--version 1.0.0 `
--publisher Example `
--payload ./examples/demo/payload `
--output ./dist/docs-first-msi.msi `
--install-dir-ui `
--force
Success prints Created ./dist/docs-first-msi.msi (2 files). The command is run in CI from a clean checkout; changing it to an unsupported invocation fails the pipeline.
3. Verify before distribution
Copy dist/docs-first-msi.msi to a disposable Windows test environment. Inspect its signature and checksum according to your release policy, then test install, repair, upgrade, and uninstall. An interactive install can be launched from an elevated PowerShell prompt:
Start-Process msiexec.exe -Verb RunAs -Wait -ArgumentList `
'/i', "`"$PWD\dist\docs-first-msi.msi`""
For unattended testing, use /qn. UI pages are not displayed in silent mode. Do not treat a successful build as a substitute for testing on supported Windows versions.
4. Move to your application
Replace the example payload with a staging directory containing exactly the files to install. Give the product a stable reverse-domain --id; changing it creates a different Windows Installer upgrade identity. Then add only the UI, conditions, folders, and shortcuts your application needs.
Previous: Documentation · Next: CLI reference