Building Go modules
With the default configuration, you can build a Go module without issues.
But if you want to access module information at runtime (for example, through
debug.BuildInfo or go version -m $binary), you need to set up GoReleaser to
“proxy” that module before building it.
To do that, add this to your configuration:
gomod:
proxy: trueIn practice, what this does is:
- for each of your builds, create a
dist/proxy/{{ build.id }}; - creates a
go.modfor a module named after the build id; - copy the project’s
go.sumto that directory. - runs
go get module@version
In which:
- build.id: the
idproperty in yourbuilddefinition; - main module: is the output of
go list -m; - main package: is the main module + your build’s
main; - current tag: is the tag that is being built.
So, let’s say:
- main module:
github.com/goreleaser/nfpm/v2; - build id:
nfpm - build’s
main:./cmd/nfpm/; - current tag:
v2.5.0.
GoReleaser will create a go.mod like:
module nfpmThen it’ll copy the go.sum into this directory, and run:
go get github.com/goreleaser/nfpm/[email protected]And, to build, it will use something like:
go build -o nfpm github.com/goreleaser/nfpm/v2/cmd/nfpmThis will resolve the source code from the defined module proxy using proxy.golang.org.
Your project’s go.sum will be used to verify any modules that are downloaded, with sum.golang.org “filling in” any gaps.
Getting the version from the module
You can also get the module version at runtime using debug#ReadBuildInfo.
It is useful to display the version of your program to the user, for example.
package main
import (
"fmt"
"runtime/debug"
)
func main() {
if info, ok := debug.ReadBuildInfo(); ok && info.Main.Sum != "" {
fmt.Println(info)
}
}You can also use go version -m my_program to display the go module information.
Limitations
- Extra files will still be copied from the current project’s root directory and not from the proxy cache;
- You can’t build packages that are not contained in the main module;
- VCS info will not be available.
More information
You can find more information about it on the issue that originated it and its subsequent pull request.
Make sure to also read the relevant documentation for more options.
Real example
Source code of a working example can be found at goreleaser/example-mod-proxy.