From: Michael Matloob Date: Fri, 4 Nov 2022 21:27:38 +0000 (-0400) Subject: cmd/go: allow -mod=vendor to be set outside of a module X-Git-Tag: go1.20rc1~317 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=f57ebed35132d02e5cf016f324853217fb545e91;p=gostls13.git cmd/go: allow -mod=vendor to be set outside of a module It will behave as if teh command-line-arguments module was vendored, with zero dependencies, much as -mod=readonly works. Fixes #56536 Change-Id: Ia02dda2f90d006b5917c3ae002ccb714987f27a3 Reviewed-on: https://go-review.googlesource.com/c/go/+/448019 Reviewed-by: Michael Matloob TryBot-Result: Gopher Robot Reviewed-by: Bryan Mills Run-TryBot: Michael Matloob --- diff --git a/src/cmd/go/internal/modload/import.go b/src/cmd/go/internal/modload/import.go index 79a0811e3c..2815ba9176 100644 --- a/src/cmd/go/internal/modload/import.go +++ b/src/cmd/go/internal/modload/import.go @@ -316,18 +316,22 @@ func importFromModules(ctx context.Context, path string, rs *Requirements, mg *M if cfg.BuildMod == "vendor" { mainModule := MainModules.mustGetSingleMainModule() modRoot := MainModules.ModRoot(mainModule) - mainDir, mainOK, mainErr := dirInModule(path, MainModules.PathPrefix(mainModule), modRoot, true) - if mainOK { - mods = append(mods, mainModule) - dirs = append(dirs, mainDir) - roots = append(roots, modRoot) - } - vendorDir, vendorOK, _ := dirInModule(path, "", filepath.Join(modRoot, "vendor"), false) - if vendorOK { - readVendorList(mainModule) - mods = append(mods, vendorPkgModule[path]) - dirs = append(dirs, vendorDir) - roots = append(roots, modRoot) + var mainErr error + if modRoot != "" { + mainDir, mainOK, err := dirInModule(path, MainModules.PathPrefix(mainModule), modRoot, true) + mainErr = err + if mainOK { + mods = append(mods, mainModule) + dirs = append(dirs, mainDir) + roots = append(roots, modRoot) + } + vendorDir, vendorOK, _ := dirInModule(path, "", filepath.Join(modRoot, "vendor"), false) + if vendorOK { + readVendorList(mainModule) + mods = append(mods, vendorPkgModule[path]) + dirs = append(dirs, vendorDir) + roots = append(roots, modRoot) + } } if len(dirs) > 1 { diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go index 6242d9e9c8..34b00d50fa 100644 --- a/src/cmd/go/internal/modload/init.go +++ b/src/cmd/go/internal/modload/init.go @@ -673,7 +673,7 @@ func LoadModFile(ctx context.Context) *Requirements { modfetch.WorkspaceGoSumFiles = append(modfetch.WorkspaceGoSumFiles, sumFile) } modfetch.GoSumFile = workFilePath + ".sum" - } else if modRoots == nil { + } else if len(modRoots) == 0 { // We're in module mode, but not inside a module. // // Commands like 'go build', 'go run', 'go list' have no go.mod file to @@ -707,6 +707,12 @@ func LoadModFile(ctx context.Context) *Requirements { pruning = workspace } requirements = newRequirements(pruning, nil, nil) + if cfg.BuildMod == "vendor" { + // For issue 56536: Some users may have GOFLAGS=-mod=vendor set. + // Make sure it behaves as though the fake module is vendored + // with no dependencies. + requirements.initVendor(nil) + } return requirements } diff --git a/src/cmd/go/testdata/script/vendor_outside_module.txt b/src/cmd/go/testdata/script/vendor_outside_module.txt new file mode 100644 index 0000000000..3ad45790e6 --- /dev/null +++ b/src/cmd/go/testdata/script/vendor_outside_module.txt @@ -0,0 +1,36 @@ +# baz.go (importing just fmt) works with -mod=mod, -mod=vendor. +go build -x -mod=mod my-module/vendor/example.com/another-module/foo/bar/baz.go +go build -x -mod=readonly my-module/vendor/example.com/another-module/foo/bar/baz.go +go build -x -mod=vendor my-module/vendor/example.com/another-module/foo/bar/baz.go + +# baz_with_outside_dep.go (with a non-std dependency) works with -mod=mod +# but not with -mod=readonly and -mod=vendor. +go build -x -mod=mod my-module/vendor/example.com/another-module/foo/bar/baz_with_outside_dep.go +! go build -x -mod=readonly my-module/vendor/example.com/another-module/foo/bar/baz_with_outside_dep.go +stderr 'no required module provides package rsc.io/quote' +! go build -x -mod=vendor my-module/vendor/example.com/another-module/foo/bar/baz_with_outside_dep.go +stderr 'no required module provides package rsc.io/quote' + +-- my-module/go.mod -- +module example.com/my-module + +go 1.20 +-- my-module/vendor/example.com/another-module/foo/bar/baz.go -- +package main + +import "fmt" + +func main() { + fmt.Println("hello, world.") +} +-- my-module/vendor/example.com/another-module/foo/bar/baz_with_outside_dep.go -- +package main + +import ( + "fmt" + "rsc.io/quote" +) + +func main() { + fmt.Println(quote.Hello()) +}