# Check that with -mod=readonly, when we load a package in a module that is # replaced but not required, we emit an error with the command to add the # requirement. # Verifies golang.org/issue/41416, golang.org/issue/41577. cp go.mod go.mod.orig # Replace all versions of a module without requiring it. # With -mod=mod, we'd add a requirement for a "zero" pseudo-version, but we # can't in readonly mode, since its go.mod may alter the build list. go mod edit -replace rsc.io/quote=./quote ! go list rsc.io/quote stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote$' go get rsc.io/quote cmp go.mod go.mod.latest go list rsc.io/quote cp go.mod.orig go.mod # Same test with a specific version. go mod edit -replace rsc.io/quote@v1.0.0-doesnotexist=./quote ! go list rsc.io/quote stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote@v1.0.0-doesnotexist$' go get rsc.io/quote@v1.0.0-doesnotexist cmp go.mod go.mod.specific go list rsc.io/quote cp go.mod.orig go.mod # If there are multiple versions, the highest is suggested. go mod edit -replace rsc.io/quote@v1.0.0-doesnotexist=./quote go mod edit -replace rsc.io/quote@v1.1.0-doesnotexist=./quote ! go list rsc.io/quote stderr '^module rsc.io/quote provides package rsc.io/quote and is replaced but not required; to add it:\n\tgo get rsc.io/quote@v1.1.0-doesnotexist$' -- go.mod -- module m go 1.16 -- go.mod.latest -- module m go 1.16 replace rsc.io/quote => ./quote require rsc.io/quote v1.5.2 // indirect -- go.mod.specific -- module m go 1.16 replace rsc.io/quote v1.0.0-doesnotexist => ./quote require rsc.io/quote v1.0.0-doesnotexist // indirect -- use.go -- package use import _ "rsc.io/quote" -- quote/go.mod -- module rsc.io/quote go 1.16 -- quote/quote.go -- package quote