]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: allow -mod=vendor to be set outside of a module
authorMichael Matloob <matloob@golang.org>
Fri, 4 Nov 2022 21:27:38 +0000 (17:27 -0400)
committerMichael Matloob <matloob@golang.org>
Thu, 10 Nov 2022 20:24:57 +0000 (20:24 +0000)
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>

src/cmd/go/internal/modload/import.go
src/cmd/go/internal/modload/init.go
src/cmd/go/testdata/script/vendor_outside_module.txt [new file with mode: 0644]

index 79a0811e3cbd89488a463c2a56f3118784a9e721..2815ba91762be574bc456269be4171a045cc1ef1 100644 (file)
@@ -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 {
index 6242d9e9c8893655d318c3f001d491546329a88b..34b00d50fa11505461cb1726bf8941456b87db1f 100644 (file)
@@ -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 (file)
index 0000000..3ad4579
--- /dev/null
@@ -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())
+}