build.go - Program for building Go binaries without a GOPATH
Switch branches/tags
Nothing to show
Clone or download
Latest commit 9dc3a60 Oct 5, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
.gitignore Initial commit Dec 3, 2016
.travis.yml Add tag to test run May 11, 2018
LICENSE Add LICENSE text to build.go Feb 11, 2018 Mention `-mod=vendor` for Go >= 1.11 Aug 30, 2018
build.go Don't default tag release Oct 5, 2018
version_test.go Detect release candidate versions of Go Feb 28, 2018

This repository contains a small and self-contained Go program called build.go. It used to compile a binary (package main) from either a checkout of the repository, or from an extracted release tar file. This enables end-users to compile the program without having to setup a GOPATH.

For it to function correctly, all dependencies need to be vendored, e.g. with dep or go mod vendor. Then, your build does not depend on any third-party resources on the Internet. For Go >= 1.11, modules are used for building and GOPROXY is set to off so that no Internet is needed when building.

The program has a build tag that is not set normally (ignore_build_go) so it is not considered when compiling the other Go code in a repository.


In order to use it, copy build.go to the root level into your repository and edit the configuration section at the top. You can see an example in the restic repository.

Instruct your users to call go run build.go and it will produce a binary from either a checkout of the repository or from an extracted release tar file. For Go 1.11, it needs to be called as go run -mod=vendor build.go so that no network access is needed.

For cross-compilation, the options --goos and --goarch can be used, e.g. like this:

$ go run build.go --goos windows --goarch 386

The tests can be run by specifying --test. By default, cgo is explicitly disabled by passing CGO_ENABLED=0 to go build, it can be re-enabled manually by running go run build.go --enable-cgo.

The program will set the string variable version in package main to a version string consisting of the contents of the file VERSION (if present) and the output of git describe (if available).

The version string can then be used e.g. in a version command, like with restic:

$ ./restic version
restic 0.8.1 (v0.8.1-154-g74665a22)

The version string consists of:

  • The contents of the VERSION file: 0.8.1
  • The nearest tag (v0.8.1), the number of commits (154) and the Git commit hash (74665a22)


The program build.go constructs a temporary GOPATH (for Go < 1.11, or when no go.mod exists) in a temporary directory as configured at the beginning of the program, then calls go build using the temporary GOPATH. This means that end-users do not have to setup a GOPATH of their own.


The tests need to be run with the build tag ignore_build_go set:

$ go test -tags ignore_build_go
ok	0.001s