| # This test makes sure workspace mode's handling of the module graph |
| # is compatible with module pruning. The graph we load from either of |
| # the workspace modules should be the same, even if their graphs |
| # don't overlap. |
| # |
| # This is the module graph in the test: |
| # |
| # example.com/p -> example.com/q v1.0.0 |
| # example.com/a -> example.com/b v1.0.0 -> example.com/q v1.1.0 -> example.com/w v1.0.0 -> example.com/x v1.0.0 -> example.com/y v1.0.0 |
| # |-> example.com/z v1.0.0 |-> example.com/z v1.1.0 |
| # |-> example.com/q v1.0.5 -> example.com/r v1.0.0 |
| # If we didn't load the whole graph and didn't load the dependencies of b |
| # when loading p, we would end up loading q v1.0.0, rather than v1.1.0, |
| # which is selected by MVS. |
| |
| go list -m all |
| stdout 'example.com/w v1.0.0' |
| stdout 'example.com/q v1.1.0' |
| stdout 'example.com/z v1.1.0' |
| stdout 'example.com/x v1.0.0' |
| ! stdout 'example.com/r' |
| ! stdout 'example.com/y' |
| |
| -- 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 |