2.7 KiB
2.7 KiB
Versioning & Minimal Version Selection
Semantic Versioning (SemVer)
Go modules use vMAJOR.MINOR.PATCH (the v prefix is required):
- MAJOR: Breaking changes to the public API
- MINOR: Backward-compatible new functionality
- PATCH: Backward-compatible bug fixes
Stability Rules
| Version | Stability |
|---|---|
v0.x.x |
Unstable — no compatibility guarantees |
v1.x.x+ |
Stable — backward-compatible within major |
| Pre-release | Unstable (e.g., v1.5.0-beta.1) |
Major Version Suffix Rule
For v2 and above, the module path must include a /vN suffix. This is Go's import compatibility rule — different major versions are treated as entirely separate modules, allowing them to coexist in the same build:
// go.mod
module github.com/example/pkg/v2
// Import in code
import "github.com/example/pkg/v2/subpkg"
Tags: v2.0.0, v2.1.0, etc. The v0 and v1 versions have no suffix.
Special Cases
- Pseudo-versions: For untagged commits —
v0.0.0-20210101120000-abcdef123456(base version + timestamp + commit hash) +incompatible: Marksv2+modules that have not adopted the/vNpath conventiongopkg.in: Always uses a version suffix with a dot —gopkg.in/yaml.v3
Minimal Version Selection (MVS)
Go's dependency resolution algorithm is fundamentally different from npm, pip, or cargo.
How It Works
Most package managers select the latest compatible version of each dependency. Go does the opposite: it selects the minimum version that satisfies all requirements. If module A requires pkg@v1.2.0 and module B requires pkg@v1.3.0, MVS selects v1.3.0 — the highest minimum required, not the latest available.
Why This Design
- Deterministic without a lock file: Given the same
go.modinputs, MVS always produces the same build list.go.sumis just integrity verification. - High fidelity: Builds closely match what module authors tested against, since the nearest compatible version is selected rather than the latest.
- No solver needed: The algorithm is simple graph traversal (under 50 lines of code), not an NP-hard constraint satisfaction problem.
- Reproducible across machines: No "works on my machine" from different lock file states.
Upgrades and Downgrades
- Upgrade:
go get pkg@v1.5.0adds an edge tov1.5.0in the module graph and reruns MVS. Only the minimum necessary changes propagate. - Downgrade:
go get pkg@v1.2.0removes all versions abovev1.2.0from the graph, then walks backward to find the latest remaining versions of affected dependencies.