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
For it to function correctly, all dependencies need to be vendored, e.g. with
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
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
--goarch can be used, e.g.
$ go run build.go --goos windows --goarch 386
The tests can be run by specifying
--test. By default,
cgo is explicitly
disabled by passing
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 version restic 0.8.1 (v0.8.1-154-g74665a22)
The version string consists of:
- The contents of the
- The nearest tag (
v0.8.1), the number of commits (
154) and the Git commit hash (
build.go constructs a temporary
GOPATH (for Go < 1.11, or when
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
$ go test -tags ignore_build_go PASS ok github.com/fd0/build-go 0.001s