How to Choose Independent vs Fixed Versioning for a Monorepo
Independent versioning bumps only what changed; fixed (locked) mode bumps every package to the same version on every release.
Independent mode keeps versions decoupled so consumers only see churn when a package they use actually changes. Fixed mode ties the whole monorepo to one version, which simplifies mental model but forces no-op bumps.
Trade-offs
| Aspect | Independent | Fixed / locked |
|---|---|---|
| Version scope | Per package | One shared version |
| No-op bumps | None | All packages bump each release |
| Tags | name@x.y.z per package | Single vX.Y.Z |
| Best for | Libraries used separately | Tightly coupled suite |
How each tool sets it
Terminal
# Lerna: lerna.json
{ "version": "independent" } # or "1.0.0" for fixed
# Changesets: .changeset/config.json
{ "fixed": [["@acme/a", "@acme/b"]] } # empty = independent
# Nx: nx.json
{ "release": { "projectsRelationship": "independent" } }Gotchas
- Fixed mode publishes unchanged packages at a new version, which can confuse consumers who see a bump with no changelog entries.
- Independent mode requires per-package changelogs and per-package tags to stay legible.
Related guides
How to Configure Fixed vs Independent Versioning With ChangesetsSet up independent per-package versions or lock a group of packages to one version in Changesets using the fi…
How to Release a Monorepo With lerna version and lerna publishBump and publish workspace packages with lerna version and lerna publish, choosing conventional commits and i…