# Because 'go mod' subcommands ignore build constraints, they can encounter # package-import cycles that are not possible in an ordinary build. This test # verifies that such cycles are handled even when they cross module boundaries. # First, verify that the import graph depends on build tags as expected. go list -deps example.com/left stdout '^example.com/right$' go list -deps example.com/right ! stdout left env GOFLAGS=-tags=mirror go list -deps example.com/left ! stdout right go list -deps example.com/right stdout '^example.com/left$' env GOFLAGS='' # 'go mod why' should be agnostic to build tags. go mod why example.com/left stdout '^example.com/chiral$\n^example.com/left$' go mod why example.com/right stdout '^example.com/chiral$\n^example.com/right$' env GOFLAGS='-tags=mirror' go mod why example.com/left stdout '^example.com/chiral$\n^example.com/left$' go mod why example.com/right stdout '^example.com/chiral$\n^example.com/right$' env GOFLAGS='' # 'go mod tidy' should successfully handle the cycle. env GOFLAGS=-mod=readonly go mod tidy # 'go mod vendor' should copy in both packages without crashing. go mod vendor exists vendor/example.com/left/default.go exists vendor/example.com/left/mirror.go exists vendor/example.com/right/default.go exists vendor/example.com/right/mirror.go -- go.mod -- module example.com/chiral go 1.14 require ( example.com/left v0.1.0 example.com/right v0.1.0 ) replace ( example.com/left => ./left example.com/right => ./right ) -- chiral.go -- // Package chiral imports packages in an order that depends on build tags. package chiral -- default.go -- // +build !mirror package chiral import _ "example.com/left" -- mirror.go -- // +build mirror package chiral import _ "example.com/right" -- left/go.mod -- module example.com/left go 1.14 require example.com/right v0.1.0 replace example.com/right v0.1.0 => ../right -- left/default.go -- // +build !mirror package left import _ "example.com/right" -- left/mirror.go -- // +build mirror package left -- right/go.mod -- module example.com/right go 1.14 require example.com/left v0.1.0 replace example.com/left v0.1.0 => ../left -- right/default.go -- // +build !mirror package right -- right/mirror.go -- // +build mirror package right import _ "example.com/left"