1
0
mirror of https://github.com/golang/go synced 2024-11-23 20:50:04 -07:00

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>
This commit is contained in:
Michael Matloob 2022-11-04 17:27:38 -04:00
parent e87e799767
commit f57ebed351
3 changed files with 59 additions and 13 deletions

View 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 {

View 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
}

View File

@ -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())
}