-
Notifications
You must be signed in to change notification settings - Fork 18.5k
Description
What version of Go are you using (go version)?
$ go version go version go1.13.5 linux/amd64
Does this issue reproduce with the latest release?
Yes. 1.13.5 is the latest release at this date.
What operating system and processor architecture are you using (go env)?
go env Output
$ go env GOARCH="amd64" GOOS="linux"
What did you do?
I have three modules, a, b and c. All use go modules. a/go.mod requires b and c, and (due to history) b/go.mod requires a. One (or both) of those cyclic requires refers to an older version than the newest, but it's new enough for both a and b to build.
Now I wanted to downgrade module c to an older version. So I edited a/go.mod, and rebuild a. The c line in a/go.mod was edited to the newer version of c, which I had been using before, and which I did not want to use anymore.
Investigating with go mod graph showed that the newer c was required by an older a, which was required by the current b, which was required by the current a. In other words
a@now -> b@now -> a@older -> c@newer
What did you expect to see?
I did not expect the a@older/go.mod to be of any consequence to the go modules choice of version of c, since in the end it was going to use a@now to build, not a@older.
What did you see instead?
go mod graph showed that because of the cycling in the module dependency graph, a@older/go.mod was consulted, as if a@older wasn't an older version of a module already in the graph, but rather some other independent module.
As a consequence a@older's dependencies changed a@now's build.