env GO111MODULE=on # Replacement should not use a vendor directory as the target. ! go mod vendor stderr 'replacement path ./vendor/not-rsc.io/quote/v3 inside vendor directory' cp go.mod1 go.mod rm -r vendor # Before vendoring, we expect to see the original directory. go list -f '{{with .Module}}{{.Version}}{{end}} {{.Dir}}' rsc.io/quote/v3 stdout 'v3.0.0' stdout '.*[/\\]not-rsc.io[/\\]quote[/\\]v3' # Since all dependencies are replaced, 'go mod vendor' should not # have to download anything from the network. go mod vendor ! stderr 'downloading' ! stderr 'finding' # After vendoring, we expect to see the replacement in the vendor directory, # without attempting to look up the non-replaced version. cmp vendor/rsc.io/quote/v3/quote.go local/not-rsc.io/quote/v3/quote.go go list -mod=vendor -f '{{with .Module}}{{.Version}}{{end}} {{.Dir}}' rsc.io/quote/v3 stdout 'v3.0.0' stdout '.*[/\\]vendor[/\\]rsc.io[/\\]quote[/\\]v3' ! stderr 'finding' ! stderr 'lookup disabled' # 'go list' should provide the original replacement directory as the module's # replacement path. go list -mod=vendor -f '{{with .Module}}{{with .Replace}}{{.Path}}{{end}}{{end}}' rsc.io/quote/v3 stdout '.*[/\\]not-rsc.io[/\\]quote[/\\]v3' # The same module can't be used as two different paths. cd multiple-paths ! go mod vendor stderr 'rsc.io/quote/v3@v3.0.0 used for two different module paths \(not-rsc.io/quote/v3 and rsc.io/quote/v3\)' -- go.mod -- module example.com/replace require rsc.io/quote/v3 v3.0.0 replace rsc.io/quote/v3 => ./vendor/not-rsc.io/quote/v3 -- go.mod1 -- module example.com/replace require rsc.io/quote/v3 v3.0.0 replace rsc.io/quote/v3 => ./local/not-rsc.io/quote/v3 -- imports.go -- package replace import _ "rsc.io/quote/v3" -- local/not-rsc.io/quote/v3/go.mod -- module not-rsc.io/quote/v3 -- local/not-rsc.io/quote/v3/quote.go -- package quote -- multiple-paths/main.go -- package main import ( "fmt" "rsc.io/quote/v3" ) func main() { fmt.Println(quote.GoV3()) } -- multiple-paths/go.mod -- module quoter require ( rsc.io/quote/v3 v3.0.0 not-rsc.io/quote/v3 v3.0.0 ) replace not-rsc.io/quote/v3 => rsc.io/quote/v3 v3.0.0 -- multiple-paths/go.sum -- golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= rsc.io/quote/v3 v3.0.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -- vendor/not-rsc.io/quote/v3/go.mod -- module not-rsc.io/quote/v3 -- vendor/not-rsc.io/quote/v3/quote.go -- package quote