GoReleaser vs nFPM: Release vs Package Building
These overlap but differ in scope: nFPM builds Linux packages (deb, rpm, apk) from a simple config with no native toolchains, while GoReleaser automates the whole release (build, archive, package, checksum, publish) and uses nFPM under the hood for the packaging step.
GoReleaser and nFPM are both popular in Go projects (and beyond) but address different parts of shipping software. nFPM is a focused, dependency-free packager that produces deb, rpm, and apk packages from one YAML file, without needing dpkg or rpmbuild installed. GoReleaser is an end-to-end release tool that compiles cross-platform binaries, creates archives and checksums, builds packages (via nFPM), and publishes to GitHub/registries.
| GoReleaser | nFPM | |
|---|---|---|
| Scope | Full release pipeline | Package building only |
| Outputs | Binaries, archives, packages, releases | deb, rpm, apk packages |
| Cross-compile | Yes (manages builds) | No (you provide files) |
| Publishing | GitHub, registries, Homebrew, etc. | None (just produces packages) |
| Native tools needed | No | No (pure implementation) |
| Relationship | Uses nFPM internally | A building block |
Where each genuinely wins
nFPM wins when packaging is all you need: it turns existing binaries and files into deb/rpm/apk without installing distro-specific tooling, which is great for minimal CI images. GoReleaser wins when you want the entire release automated: it handles cross-compilation, archives, checksums, changelogs, signing, and publishing to GitHub Releases, container registries, and package managers, all from one config.
In CI
GoReleaser is built for CI: a tagged release triggers goreleaser release, which produces every artifact and publishes them, often as a single workflow step. If you only need packages (for example, your build already produces binaries another way), nFPM keeps the CI step small and toolchain-free. Many pipelines use nFPM directly for simple package output and GoReleaser when they want full release orchestration.
Honest caveats
GoReleaser is broad but most ergonomic for Go projects; using it for other languages works but is less idiomatic, and its config can grow large. nFPM is intentionally narrow: it does not build, sign-and-publish, or manage releases, so you wire those steps yourself. Choosing nFPM means assembling more of the pipeline by hand.
The verdict
Use nFPM when you just need deb/rpm/apk packages without native tooling. Use GoReleaser when you want full release automation (build, package, sign, publish), keeping in mind it relies on nFPM for the packaging part.