cp go.mod go.mod.orig # Populate go.sum. go mod download # 'go list pkg' does not report an error when a retracted version is used. go list -e -f '{{if .Error}}{{.Error}}{{end}}' ./use ! stdout . cmp go.mod go.mod.orig # Nor does 'go build'. [!short] go build ./use [!short] ! stderr . [!short] cmp go.mod go.mod.orig # Neither 'go list' nor 'go build' should download go.mod from the version # that would list retractions. exists $GOPATH/pkg/mod/cache/download/example.com/retract/@v/v1.0.0-bad.mod ! exists $GOPATH/pkg/mod/cache/download/example.com/retract/@v/v1.1.0.mod # Importing a package from a module with a retracted latest version will # select the latest non-retracted version. go get -d ./use_self_prev go list -m example.com/retract/self/prev stdout '^example.com/retract/self/prev v1.1.0$' exists $GOPATH/pkg/mod/cache/download/example.com/retract/self/prev/@v/v1.9.0.mod -- go.mod -- module example.com/use go 1.15 require example.com/retract v1.0.0-bad -- use/use.go -- package use import _ "example.com/retract" -- use_self_prev/use.go -- package use_self_prev import _ "example.com/retract/self/prev"