The Go module proxy and forcing Go to actually update module versions
Suppose, not hypothetically, that you have two modules, such as a
program and a general
module that it uses. Through
working on the program, you realize that there are some bugs in the
general module, so you fix them and then test them in the program
by temporarily using a replace
directive, or perhaps a workspace. Eventually you're satisfied
with the changes to your module, so you commit them and push the
change to the public repository. Now you want to update your program's
go.mod
to use the module version you've just pushed.
As lots of instructions will tell you, this is straightforward; you
want some version of 'go get -u
', perhaps 'go get -u .
'. However,
if you try this immediately, you may discover that Go is not updating
the module's version. No matter what you do, not even removing the
module from 'go.mod
' and then go-get'ing it again, will make Go
budge. As far as Go seems to be concerned, your module has not
updated and the only available version is the previous one.
(It's possible that 'go get -u <module>@latest
' will work here,
I didn't think to try it when this happened to me.)
As far as I can tell, what is going on here is the Go module proxy. By default, 'go get
' will consult
the (public) Go module proxy, and the Go module proxy can have a
delay between when you push an update to the public repositories
and when the module proxy sees it. I assume that under the hood
there's various sorts of rate limiting and other caching, since I
expect neither the Go proxy nor the various forges out there want
the Go proxy to query forges on every single request just in case
an infrequently updated module has been updated this time around.
The blunt hammer way of defeating this is to force 'go get -u
'
to not use the Go module proxy, with 'GOPROXY=direct go get -u
'.
This will force Go to directly query the public source and so make
it notice your just-pushed update.
PS: If you tagged a new version I believe you can hand edit your
go.mod
to have the new version. This is more difficult if your
module is not officially released, has no version tags, and is using
the 'v0.0.0-<git information>' format in go.mod
.
PPS: Possibly there is another way you're supposed to do this. If so, it doesn't seem to be well documented.
|
|