env GO111MODULE=on env GOFLAGS=-mod=mod [short] skip # golang.org/issue/30166: 'go mod tidy' should not crash if a replaced module is # involved in a cycle. cd cycle env GOTRACEBACK=off go mod tidy cd .. # From inside the module, 'go list -m all' should NOT include transitive # requirements of modules that have been replaced. go list -m all stdout 'rsc.io/quote/v3 v3.0.0' ! stdout 'rsc.io/sampler' ! stdout 'golang.org/x/text' # From outside the module, 'go list -m all' should include them. cd outside go list -m all stdout 'rsc.io/quote/v3 v3.0.0' stdout 'rsc.io/sampler v1.3.0' stdout 'golang.org/x/text' cd .. # 'go list all' should add indirect requirements to satisfy the packages # imported from replacement modules. ! grep 'rsc.io/sampler' go.mod ! grep 'golang.org/x/text' go.mod go list all grep 'rsc.io/sampler' go.mod grep 'golang.org/x/text' go.mod # 'go get' and 'go mod tidy' should follow the requirements of the replacements, # not the originals, even if that results in a set of versions that are # misleading or redundant without those replacements. go get rsc.io/sampler@v1.2.0 go mod tidy go list -m all stdout 'rsc.io/quote/v3 v3.0.0' stdout 'rsc.io/sampler v1.2.0' stdout 'golang.org/x/text' # The requirements seen from outside may be higher (or lower) # than those seen from within the module. grep 'rsc.io/sampler v1.2.0' go.mod cd outside go list -m all stdout 'rsc.io/sampler v1.3.0' cd .. # The same module can't be used as two different paths. cd multiple-paths ! go mod tidy 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/tidy require rsc.io/quote/v3 v3.0.0 replace rsc.io/quote/v3 => ./not-rsc.io/quote/v3 -- imports.go -- package tidy import _ "rsc.io/quote/v3" -- outside/go.mod -- module example.com/tidy/outside require example.com/tidy v0.0.0 replace example.com/tidy => ./.. -- not-rsc.io/quote/v3/go.mod -- module not-rsc.io/quote/v3 // No requirements specified! -- not-rsc.io/quote/v3/quote.go -- package quote import ( _ "rsc.io/sampler" _ "golang.org/x/text/language" ) -- cycle/go.mod -- module golang.org/issue/30166 require ( golang.org/issue/30166/a v0.0.0 golang.org/issue/30166/b v0.0.0 ) replace ( golang.org/issue/30166/a => ./a golang.org/issue/30166/b => ./b ) -- cycle/cycle.go -- package cycle import ( _ "golang.org/issue/30166/a" _ "golang.org/issue/30166/b" ) -- cycle/a/a.go -- package a -- cycle/a/go.mod -- module golang.org/issue/30166/a require golang.org/issue/30166/b v0.0.0 -- cycle/b/b.go -- package b -- cycle/b/go.mod -- module golang.org/issue/30166/b require golang.org/issue/30166/a v0.0.0 -- 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/use.go -- package quoter import ( _ "not-rsc.io/quote/v3" _ "rsc.io/quote/v3" )