# This test illustrates the relationship between the 'all' pattern and # the dependencies of the main module. # The package import graph used in this test looks like: # # main --------- a --------- b # | | # | a_test ---- c # | | # | c_test ---- d # | # main_test ---- t --------- u # | # t_test ---- w # | # w_test ---- x # # main/testonly_test ---- q --------- r # | # q_test ---- s # # And the module dependency graph looks like: # # main --- a.1 ---- b.1 # \ \ \ # \ \ c.1 -- d.1 # \ \ # \ t.1 ---- u.1 # \ \ # \ w.1 -- x.1 # \ # q.1 ---- r.1 # \ # s.1 env PKGFMT='{{if .Module}}{{.ImportPath}}{{end}}' env MODFMT='{{.Path}}' # 'go list -deps' lists packages and tests in the main module, # along with their transitive dependencies. go list -f $PKGFMT -deps ./... stdout -count=4 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main/testonly' # 'go list -deps -test' lists transitive imports of tests and non-tests in the # main module. go list -f $PKGFMT -deps -test ./... stdout -count=13 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main.test$' stdout '^example.com/main \[example.com/main.test\]$' stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/t$' stdout '^example.com/u$' # 'go list all' lists the fixpoint of iterating 'go list -deps -test' starting # with the packages in the main module, then reducing to only the non-test # variants of those packages. go list -f $PKGFMT all stdout -count=13 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' stdout '^example.com/x$' # 'go list -test all' is equivalent to 'go list -test $(go list all)' # and both should include tests for every package in 'all'. go list -test -f $PKGFMT example.com/a example.com/b example.com/c example.com/d example.com/main example.com/main/testonly example.com/q example.com/r example.com/s example.com/t example.com/u example.com/w example.com/x cp stdout list-test-explicit.txt go list -test -f $PKGFMT all cmp stdout list-test-explicit.txt stdout -count=36 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' stdout '^example.com/x$' stdout '^example.com/a.test$' stdout '^example.com/a_test \[example.com/a.test\]$' stdout '^example.com/b.test$' stdout '^example.com/b_test \[example.com/b.test\]$' stdout '^example.com/c.test$' stdout '^example.com/c_test \[example.com/c.test\]$' stdout '^example.com/main.test$' stdout '^example.com/main \[example.com/main.test\]$' stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' stdout '^example.com/q.test$' stdout '^example.com/q_test \[example.com/q.test\]$' stdout '^example.com/r.test$' stdout '^example.com/r_test \[example.com/r.test\]$' stdout '^example.com/s.test$' stdout '^example.com/s_test \[example.com/s.test\]$' stdout '^example.com/t.test$' stdout '^example.com/t_test \[example.com/t.test\]$' stdout '^example.com/u.test$' stdout '^example.com/u_test \[example.com/u.test\]$' stdout '^example.com/w.test$' stdout '^example.com/w_test \[example.com/w.test\]$' # 'go list -m all' covers the packages in 'go list -test -deps all'. go list -m -f $MODFMT all stdout -count=12 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' stdout '^example.com/x$' # 'go mod vendor' copies in only the packages transitively imported by the main # module, and omits their tests. As a result, the 'all' and '...' patterns # report fewer packages when using '-mod=vendor'. go mod vendor go list -f $PKGFMT -mod=vendor all stdout -count=8 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/t$' stdout '^example.com/u$' go list -test -f $PKGFMT -mod=vendor all stdout -count=13 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/main.test$' stdout '^example.com/main \[example.com/main.test\]$' stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' rm vendor # Convert all modules to go 1.17 to enable lazy loading. go mod edit -go=1.17 a/go.mod go mod edit -go=1.17 b/go.mod go mod edit -go=1.17 c/go.mod go mod edit -go=1.17 d/go.mod go mod edit -go=1.17 q/go.mod go mod edit -go=1.17 r/go.mod go mod edit -go=1.17 s/go.mod go mod edit -go=1.17 t/go.mod go mod edit -go=1.17 u/go.mod go mod edit -go=1.17 w/go.mod go mod edit -go=1.17 x/go.mod go mod edit -go=1.17 cmp go.mod go.mod.beforetidy go mod tidy cmp go.mod go.mod.aftertidy # With lazy loading, 'go list all' with neither -mod=vendor nor -test should # match -mod=vendor without -test in 1.15. go list -f $PKGFMT all stdout -count=8 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/t$' stdout '^example.com/u$' # 'go list -test all' should expand that to include the test variants of the # packages in 'all', but not the dependencies of outside tests. go list -test -f $PKGFMT all stdout -count=25 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/a.test$' stdout '^example.com/a_test \[example.com/a.test\]$' stdout '^example.com/b.test$' stdout '^example.com/b_test \[example.com/b.test\]$' stdout '^example.com/main.test$' stdout '^example.com/main \[example.com/main.test\]$' stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' stdout '^example.com/q.test$' stdout '^example.com/q_test \[example.com/q.test\]$' stdout '^example.com/r.test$' stdout '^example.com/r_test \[example.com/r.test\]$' stdout '^example.com/t.test$' stdout '^example.com/t_test \[example.com/t.test\]$' stdout '^example.com/u.test$' stdout '^example.com/u_test \[example.com/u.test\]$' # 'go list -test -deps all' should include the dependencies of those tests, # but not the tests of the dependencies of outside tests. go list -test -deps -f $PKGFMT all stdout -count=28 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' stdout '^example.com/main$' stdout '^example.com/main/testonly$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' stdout '^example.com/a.test$' stdout '^example.com/a_test \[example.com/a.test\]$' stdout '^example.com/b.test$' stdout '^example.com/b_test \[example.com/b.test\]$' stdout '^example.com/main.test$' stdout '^example.com/main \[example.com/main.test\]$' stdout '^example.com/main_test \[example.com/main.test\]$' stdout '^example.com/main/testonly.test$' stdout '^example.com/main/testonly_test \[example.com/main/testonly.test\]$' stdout '^example.com/q.test$' stdout '^example.com/q_test \[example.com/q.test\]$' stdout '^example.com/r.test$' stdout '^example.com/r_test \[example.com/r.test\]$' stdout '^example.com/t.test$' stdout '^example.com/t_test \[example.com/t.test\]$' stdout '^example.com/u.test$' stdout '^example.com/u_test \[example.com/u.test\]$' # 'go list -m all' should cover all of the modules providing packages in # 'go list -test -deps all', but should exclude modules d and x, # which are not relevant to the main module and are outside of the # lazy-loading horizon. go list -m -f $MODFMT all stdout -count=10 '^.' stdout '^example.com/a$' stdout '^example.com/b$' stdout '^example.com/c$' ! stdout '^example.com/d$' stdout '^example.com/main$' stdout '^example.com/q$' stdout '^example.com/r$' stdout '^example.com/s$' stdout '^example.com/t$' stdout '^example.com/u$' stdout '^example.com/w$' ! stdout '^example.com/x$' -- go.mod -- module example.com/main // Note: this go.mod file initially specifies go 1.15, // but includes some redundant roots so that it // also already obeys the 1.17 lazy loading invariants. go 1.15 require ( example.com/a v0.1.0 example.com/b v0.1.0 // indirect example.com/q v0.1.0 example.com/r v0.1.0 // indirect example.com/t v0.1.0 example.com/u v0.1.0 // indirect ) replace ( example.com/a v0.1.0 => ./a example.com/b v0.1.0 => ./b example.com/c v0.1.0 => ./c example.com/d v0.1.0 => ./d example.com/q v0.1.0 => ./q example.com/r v0.1.0 => ./r example.com/s v0.1.0 => ./s example.com/t v0.1.0 => ./t example.com/u v0.1.0 => ./u example.com/w v0.1.0 => ./w example.com/x v0.1.0 => ./x ) -- main.go -- package main import _ "example.com/a" func main() {} -- main_test.go -- package main_test import _ "example.com/t" -- testonly/testonly_test.go -- package testonly_test import _ "example.com/q" -- a/go.mod -- module example.com/a go 1.15 require ( example.com/b v0.1.0 example.com/c v0.1.0 ) -- a/a.go -- package a import _ "example.com/b" -- a/a_test.go -- package a_test import _ "example.com/c" -- b/go.mod -- module example.com/b go 1.15 -- b/b.go -- package b -- b/b_test.go -- package b_test -- c/go.mod -- module example.com/c go 1.15 require example.com/d v0.1.0 -- c/c.go -- package c -- c/c_test.go -- package c_test import _ "example.com/d" -- d/go.mod -- module example.com/d go 1.15 -- d/d.go -- package d -- q/go.mod -- module example.com/q go 1.15 require ( example.com/r v0.1.0 example.com/s v0.1.0 ) -- q/q.go -- package q import _ "example.com/r" -- q/q_test.go -- package q_test import _ "example.com/s" -- r/go.mod -- module example.com/r go 1.15 -- r/r.go -- package r -- r/r_test.go -- package r_test -- s/go.mod -- module example.com/s go 1.15 -- s/s.go -- package s -- s/s_test.go -- package s_test -- t/go.mod -- module example.com/t go 1.15 require ( example.com/u v0.1.0 example.com/w v0.1.0 ) -- t/t.go -- package t import _ "example.com/u" -- t/t_test.go -- package t_test import _ "example.com/w" -- u/go.mod -- module example.com/u go 1.15 -- u/u.go -- package u -- u/u_test.go -- package u_test -- w/go.mod -- module example.com/w go 1.15 require example.com/x v0.1.0 -- w/w.go -- package w -- w/w_test.go -- package w_test import _ "example.com/x" -- x/go.mod -- module example.com/x go 1.15 -- x/x.go -- package x -- go.mod.beforetidy -- module example.com/main // Note: this go.mod file initially specifies go 1.15, // but includes some redundant roots so that it // also already obeys the 1.17 lazy loading invariants. go 1.17 require ( example.com/a v0.1.0 example.com/b v0.1.0 // indirect example.com/q v0.1.0 example.com/r v0.1.0 // indirect example.com/t v0.1.0 example.com/u v0.1.0 // indirect ) replace ( example.com/a v0.1.0 => ./a example.com/b v0.1.0 => ./b example.com/c v0.1.0 => ./c example.com/d v0.1.0 => ./d example.com/q v0.1.0 => ./q example.com/r v0.1.0 => ./r example.com/s v0.1.0 => ./s example.com/t v0.1.0 => ./t example.com/u v0.1.0 => ./u example.com/w v0.1.0 => ./w example.com/x v0.1.0 => ./x ) -- go.mod.aftertidy -- module example.com/main // Note: this go.mod file initially specifies go 1.15, // but includes some redundant roots so that it // also already obeys the 1.17 lazy loading invariants. go 1.17 require ( example.com/a v0.1.0 example.com/q v0.1.0 example.com/t v0.1.0 ) require ( example.com/b v0.1.0 // indirect example.com/r v0.1.0 // indirect example.com/u v0.1.0 // indirect ) replace ( example.com/a v0.1.0 => ./a example.com/b v0.1.0 => ./b example.com/c v0.1.0 => ./c example.com/d v0.1.0 => ./d example.com/q v0.1.0 => ./q example.com/r v0.1.0 => ./r example.com/s v0.1.0 => ./s example.com/t v0.1.0 => ./t example.com/u v0.1.0 => ./u example.com/w v0.1.0 => ./w example.com/x v0.1.0 => ./x )