# This test exercises that vendoring works properly using the workspace in the # the work_prune test case. go work vendor cmp vendor/modules.txt modules.txt.want go list -f '{{with .Module}}{{.Path}}@{{.Version}}{{end}}' all cmp stdout want_versions go list -f '{{.Dir}}' example.com/q stdout $GOPATH[\\/]src[\\/]vendor[\\/]example.com[\\/]q go list -f '{{.Dir}}' example.com/b stdout $GOPATH[\\/]src[\\/]vendor[\\/]example.com[\\/]b go list -f '{{.Dir}}' example.com/w stdout $GOPATH[\\/]src[\\/]vendor[\\/]example.com[\\/]w go list -f '{{.Dir}}' example.com/z stdout $GOPATH[\\/]src[\\/]vendor[\\/]example.com[\\/]z cmp $GOPATH/src/vendor/example.com/q/q.go q1_1_0/q.go -- modules.txt.want -- ## workspace # example.com/b v1.0.0 => ./b ## explicit; go 1.18 example.com/b # example.com/q v1.0.0 => ./q1_0_0 ## explicit; go 1.18 # example.com/q v1.1.0 => ./q1_1_0 ## go 1.18 example.com/q # example.com/w v1.0.0 => ./w ## go 1.18 example.com/w # example.com/z v1.0.0 => ./z1_0_0 ## explicit; go 1.18 # example.com/z v1.1.0 => ./z1_1_0 ## go 1.18 example.com/z # example.com/q v1.0.5 => ./q1_0_5 # example.com/r v1.0.0 => ./r # example.com/x v1.0.0 => ./x # example.com/y v1.0.0 => ./y -- want_versions -- example.com/a@ example.com/b@v1.0.0 example.com/p@ example.com/q@v1.1.0 example.com/w@v1.0.0 example.com/z@v1.1.0 -- go.work -- go 1.18 use ( ./a ./p ) replace example.com/b v1.0.0 => ./b replace example.com/q v1.0.0 => ./q1_0_0 replace example.com/q v1.0.5 => ./q1_0_5 replace example.com/q v1.1.0 => ./q1_1_0 replace example.com/r v1.0.0 => ./r replace example.com/w v1.0.0 => ./w replace example.com/x v1.0.0 => ./x replace example.com/y v1.0.0 => ./y replace example.com/z v1.0.0 => ./z1_0_0 replace example.com/z v1.1.0 => ./z1_1_0 -- a/go.mod -- module example.com/a go 1.18 require example.com/b v1.0.0 require example.com/z v1.0.0 -- a/foo.go -- package main import "example.com/b" func main() { b.B() } -- b/go.mod -- module example.com/b go 1.18 require example.com/q v1.1.0 -- b/b.go -- package b func B() { } -- p/go.mod -- module example.com/p go 1.18 require example.com/q v1.0.0 replace example.com/q v1.0.0 => ../q1_0_0 replace example.com/q v1.1.0 => ../q1_1_0 -- p/main.go -- package main import "example.com/q" func main() { q.PrintVersion() } -- q1_0_0/go.mod -- module example.com/q go 1.18 -- q1_0_0/q.go -- package q import "fmt" func PrintVersion() { fmt.Println("version 1.0.0") } -- q1_0_5/go.mod -- module example.com/q go 1.18 require example.com/r v1.0.0 -- q1_0_5/q.go -- package q import _ "example.com/r" -- q1_1_0/go.mod -- module example.com/q require example.com/w v1.0.0 require example.com/z v1.1.0 go 1.18 -- q1_1_0/q.go -- package q import _ "example.com/w" import _ "example.com/z" import "fmt" func PrintVersion() { fmt.Println("version 1.1.0") } -- r/go.mod -- module example.com/r go 1.18 require example.com/r v1.0.0 -- r/r.go -- package r -- w/go.mod -- module example.com/w go 1.18 require example.com/x v1.0.0 -- w/w.go -- package w -- w/w_test.go -- package w import _ "example.com/x" -- x/go.mod -- module example.com/x go 1.18 -- x/x.go -- package x -- x/x_test.go -- package x import _ "example.com/y" -- y/go.mod -- module example.com/y go 1.18 -- y/y.go -- package y -- z1_0_0/go.mod -- module example.com/z go 1.18 require example.com/q v1.0.5 -- z1_0_0/z.go -- package z import _ "example.com/q" -- z1_1_0/go.mod -- module example.com/z go 1.18 -- z1_1_0/z.go -- package z