Skip to content
Latchkey

gvm vs asdf: Managing Go Versions

gvm is a Go-specific version manager with GOPATH and pkgset handling; asdf manages Go alongside many other languages via plugins.

gvm focuses solely on Go, installing multiple Go versions, managing GOPATH, and offering pkgsets for isolating dependencies in the pre-modules era. asdf manages Go through a plugin and a shared .tool-versions file, unifying it with Node, Python, and others. With Go modules now standard, much of gvm extra machinery matters less, and asdf (or the official toolchain) covers most needs.

gvmasdf
ScopeGo onlyPolyglot
GOPATH / pkgsetsBuilt inNot needed (modules)
Config filegvm-specific.tool-versions
MaintenanceLess activeActive
Best forLegacy Go workflowsMixed-language repos

In CI

In CI, Go is usually installed via setup-go or asdf pinning a single version; gvm GOPATH and pkgset features are largely obsolete with modules. asdf keeps Go pinned next to your other runtimes in one file, which is cleaner for polyglot pipelines. gvm fits only if you maintain older Go workflows.

Speed it up

Cache the Go install and the module cache keyed on go.sum. Both run on CI runners; faster managed runners shorten the Go install, build, and test steps.

The verdict

Maintaining legacy Go projects that rely on GOPATH or pkgsets: gvm. Managing Go alongside other languages in a modern, modules-based repo: asdf (or setup-go in CI). For most teams today asdf or the official toolchain is the simpler choice.

Related guides

Run this faster and cheaper on Latchkey managed runners. Start free →