Description
<rant>
This is quite honestly becoming (literally) rage-inducing so I'll keep it short...
Since the introduction of the package cache and modules, go list
has gained some (IMO) nasty side-effects like downloading things from the internet and compiling (CGO) packages when all I did was ask it to print the import path of the current package.
Additionally, package querying shouldn't result in updating any files. This coupled with the fact that GOPATH/mod/...
is readonly means that if you're in a package inside the mod cache and run go list
it might fail because it can't write to go.mod
(why is it updating the file?!?!?!).
This script that creates a go.mod
file with an extra empty line at the end demonstrates the latter issue:
$ bash -c 'cd $(mktemp -d) && echo "package app" > app.go && echo -e "module app\n" > go.mod; go list -mod=readonly'
go: updates to go.mod needed, disabled by -mod=readonly
To make matters worse, go/build
suddenly started calling go list
so a simple operation like .Import(...FindOnly)
that used to take no more than a couple milliseconds, now takes several seconds for no good reason... all because the go
tool decided it was going download things from the internet, compile things and god knows what else... all manner of surprises I didn't ask for.
Usually I'd just code my way around it with the power of NIH, but the behavior of go/build
and package lookups and querying in general is un(der)-documented and I don't want to have to keep track of whatever new magic it mightwill gain in the future.
I doubt any of this is ever going to be fixed, so it'd be nice if these things were documented so I could answer questions like "given an import path, how do I go about finding it in GOPATH
, vendor
, module cache
, build cache
, etc.?" without having to rely on some broken black box.