diff options
| author | Michael Matloob <matloob@golang.org> | 2022-11-04 17:27:38 -0400 |
|---|---|---|
| committer | Michael Matloob <matloob@golang.org> | 2022-11-10 20:24:57 +0000 |
| commit | f57ebed35132d02e5cf016f324853217fb545e91 (patch) | |
| tree | aa829516431ca1a2d42e3fd421b0d91b462cd342 /src | |
| parent | e87e7997677b66b4afd2d4f23d35f561127dac02 (diff) | |
| download | go-f57ebed35132d02e5cf016f324853217fb545e91.tar.xz | |
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 <matloob@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Bryan Mills <bcmills@google.com>
Run-TryBot: Michael Matloob <matloob@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/go/internal/modload/import.go | 28 | ||||
| -rw-r--r-- | src/cmd/go/internal/modload/init.go | 8 | ||||
| -rw-r--r-- | src/cmd/go/testdata/script/vendor_outside_module.txt | 36 |
3 files changed, 59 insertions, 13 deletions
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()) +} |
