golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
123.13k stars 17.56k forks source link

cmd/go/internal/modcmd: download with -json flag doesn't print JSON objects to stdout for some module download errors #69510

Open dmitshur opened 1 week ago

dmitshur commented 1 week ago

Go version

go version go1.23.1 darwin/arm64

Output of go env -changed in your module/workspace


```sh GOPROXY='http://127.0.0.1' ```

What did you do?

https://pkg.go.dev/cmd/go#hdr-Download_modules_to_local_cache says:

The -json flag causes download to print a sequence of JSON objects to standard output, describing each downloaded module (or failure), corresponding to this Go struct: type Module struct { ... }

It seems that doesn't always happen for some networking errors observed in the Go build system (build 8736907273916323825 being one example). Consider a minimal set of steps which seems to reproduce the problem:

$ export GOPROXY=http://127.0.0.1  # simulate an error downloading modules
$ cd $(mktemp -d)
$ printf 'module test\nrequire example.com v0.0.0\n' > go.mod
$ go mod download -json

What did you see happen?

No JSON is printed to stdout:

$ go mod download -json 2>/dev/null
$

What did you expect to see?

JSON is printed to stdout, describing the error:

$ go mod download -json 2>/dev/null
{
    "Path": "example.com",
    "Version": "v0.0.0",
    "Error": "Get \"http://127.0.0.1/example.com/@v/v0.0.0.mod\": dial tcp 127.0.0.1:80: connect: connection refused"
}
$

CC @matloob, @samthanawalla.

gabyhelp commented 1 week ago

Related Issues and Documentation

(Emoji vote if this was helpful or unhelpful; more detailed feedback welcome in this discussion.)