Description
What version of Go are you using (go version
)?
$ gotip version go version devel +d0eaec7 Wed Aug 28 21:48:01 2019 +0000 darwin/amd64
What did you do?
Following the tool-dependency best-practice in Module wiki, created tools.go to add the tool dependency. Note: the tool and the main module will share some dependencies, which is a problem.
$ gotip mod init work1 go: creating new go.mod: module work1 $ cat << EOF > tools.go // +build tools package whatever import _ "golang.org/x/tools/cmd/godoc" EOF $ gotip mod tidy go: finding golang.org/x/tools latest $ cat go.mod module work1 go 1.13 require golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74 $ gotip build -o godoc0 golang.org/x/tools/cmd/godoc $ gotip version -m godoc0 godoc0: devel +d0eaec7 Wed Aug 28 21:48:01 2019 +0000 path golang.org/x/tools/cmd/godoc mod golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74 h1:4cFkmztxtMslUX2SctSl+blCyXfpzhGOy9LhKAqSMA4= dep golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI=
Then I added some code in the main module that depends on a module the tool (godoc
) also depends on.
$ cat << EOF > foo.go package foo import _ "golang.org/x/net/http2" EOF $ gotip build $ cat go.mod module work1 go 1.13 require ( golang.org/x/net v0.0.0-20190620200207-3b0461eec859 golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74 )
The go build
of the main module picked up golang.org/x/net@v0.0.0-20190620200207-3b0461eec859
due to the existing requirement on golang.org/x/tools
.
I wanted a newer version of golang.org/x/net
, so upgraded it using go get golang.org/x/net@latest
.
$ gotip get golang.org/x/net@latest go: finding golang.org/x/net latest $ cat go.mod module work1 go 1.13 require ( golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74 )
This resulted in a side-effect: upgrade the dependency of the tool as well. That produces a different binary. (different version of golang.org/x/net
).
$ GOBIN=`pwd` gotip install golang.org/x/tools/cmd/godoc $ gotip version -m godoc godoc: devel +d0eaec7 Wed Aug 28 21:48:01 2019 +0000 path golang.org/x/tools/cmd/godoc mod golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74 h1:4cFkmztxtMslUX2SctSl+blCyXfpzhGOy9LhKAqSMA4= dep golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM=
What did you expect to see?
Stable, consistent build of the tools with the dependencies as specified in the tools go.mod
.
What did you see instead?
The dependencies interfere in both ways - the tool dependency affects the version selection choice of the main module, and vice versa.
This can cause confusion - the user would believe the godoc
was built from the version of golang.org/x/tools
module but some of the dependency was actually picked up based on the
main module's go.mod
, instead of the tool's.