-
Notifications
You must be signed in to change notification settings - Fork 18.4k
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/[email protected]
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.