aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Matloob <matloob@golang.org>2022-11-04 17:27:38 -0400
committerMichael Matloob <matloob@golang.org>2022-11-10 20:24:57 +0000
commitf57ebed35132d02e5cf016f324853217fb545e91 (patch)
treeaa829516431ca1a2d42e3fd421b0d91b462cd342 /src
parente87e7997677b66b4afd2d4f23d35f561127dac02 (diff)
downloadgo-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.go28
-rw-r--r--src/cmd/go/internal/modload/init.go8
-rw-r--r--src/cmd/go/testdata/script/vendor_outside_module.txt36
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())
+}