Go projects can be run in Devbox by adding the Go SDK to your project. If your project uses cgo or compiles against C libraries, you should also include them in your packages to ensure Go can compile successfully
devbox add go, or add the following to your devbox.json
"packages": [
"go@latest"
]This will install the latest version of the Go SDK. You can find other installable versions of Go by running devbox search go. You can also view the available versions on Nixhub
If you need additional C libraries, you can add them along with gcc to your package list. For example, if libcap is required for your project:
"packages": [
"go",
"gcc",
"libcap"
]This example configures a few environment variables in devbox.json:
"env": {
"GOPATH": "$HOME/go/",
"PATH": "$PATH:$HOME/go/bin"
}GOPATHis set to$HOME/go, which is Go's default location. Keeping theGOPATHoutside of your project directory lets the module cache ($GOPATH/pkg/mod) be shared across projects and keeps build artifacts out of your source tree.- Adding
$GOPATH/bintoPATHmakes tools installed withgo installavailable inside the Devbox shell.
Which Go toolchain is active is determined by the go binary on PATH (here,
the one provided by Nix). The init_hook sets GOROOT to match that
installation, which some tooling relies on:
"shell": {
"init_hook": [
"export \"GOROOT=$(go env GOROOT)\""
]
}Note on
GOPATH: avoid settingGOPATHto your project directory (e.g."GOPATH": "$PWD"). When a module (a directory containinggo.mod) lives insideGOPATH, the Go toolchain falls back to legacyGOPATHmode and prints a warning:go: warning: ignoring go.mod in $GOPATH /path/to/your/projectUsing
$HOME/go(as above) keeps module-aware builds working as expected.