Distribution, Packaging, and Installers
Distribution is how bits arrive on a machine and how they leave again (uninstall/upgrade). It is inseparable from updates and the build pipeline.
Framework: Software Product Essentials. How-to: Package installers for desktop apps.
Choose the channel by artifact type
| Artifact | Typical channels |
|---|---|
Library / SDK |
Language registry (npm, PyPI, crates.io, Maven, NuGet, DUB, …) — see Package registries |
CLI |
Registry + OS package managers + optional standalone archives; |
GUI / TUI desktop |
Platform installers + winget/Homebrew/Flathub; optional Store |
Game |
Steam/Epic/itch + optional standalone; launcher owns much of packaging |
Service |
Container image, OS service package, cloud marketplace, or IaC module |
Desktop installer requirements
A serious Windows/macOS/Linux desktop install should provide:
-
Predictable install location
-
Start menu / Applications entry (GUI)
-
File associations / URL protocol handlers when claimed
-
Add/Remove Programs (Windows) or equivalent uninstall
-
Upgrade that preserves user data
-
Code signing (Windows Authenticode; Apple notarization)
On Windows, prefer MSI, MSIX, or a well-behaved bundle that winget can ingest. Per-user installs reduce UAC friction for many tools; machine-wide fits enterprise.
Packaging vs “portable zip”
Portable zips are fine for power users and CI smoke tests. They are not a substitute for:
-
PATH registration
-
Uninstall cleanliness
-
Auto-update integration
-
Enterprise deployment
If you ship portable builds, label them clearly and still offer an installer.
Artifact matrix to publish
For each release tag, aim for:
-
Primary installer(s) per OS/arch
-
Optional portable archive
-
Checksums (
SHA256SUMS) and signatures -
SBOM when you can (CycloneDX/SPDX)
-
Release notes linking changelog details