mirror of https://github.com/golang/go.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 <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:
parent
e87e799767
commit
f57ebed351
|
|
@ -316,18 +316,22 @@ func importFromModules(ctx context.Context, path string, rs *Requirements, mg *M
|
||||||
if cfg.BuildMod == "vendor" {
|
if cfg.BuildMod == "vendor" {
|
||||||
mainModule := MainModules.mustGetSingleMainModule()
|
mainModule := MainModules.mustGetSingleMainModule()
|
||||||
modRoot := MainModules.ModRoot(mainModule)
|
modRoot := MainModules.ModRoot(mainModule)
|
||||||
mainDir, mainOK, mainErr := dirInModule(path, MainModules.PathPrefix(mainModule), modRoot, true)
|
var mainErr error
|
||||||
if mainOK {
|
if modRoot != "" {
|
||||||
mods = append(mods, mainModule)
|
mainDir, mainOK, err := dirInModule(path, MainModules.PathPrefix(mainModule), modRoot, true)
|
||||||
dirs = append(dirs, mainDir)
|
mainErr = err
|
||||||
roots = append(roots, modRoot)
|
if mainOK {
|
||||||
}
|
mods = append(mods, mainModule)
|
||||||
vendorDir, vendorOK, _ := dirInModule(path, "", filepath.Join(modRoot, "vendor"), false)
|
dirs = append(dirs, mainDir)
|
||||||
if vendorOK {
|
roots = append(roots, modRoot)
|
||||||
readVendorList(mainModule)
|
}
|
||||||
mods = append(mods, vendorPkgModule[path])
|
vendorDir, vendorOK, _ := dirInModule(path, "", filepath.Join(modRoot, "vendor"), false)
|
||||||
dirs = append(dirs, vendorDir)
|
if vendorOK {
|
||||||
roots = append(roots, modRoot)
|
readVendorList(mainModule)
|
||||||
|
mods = append(mods, vendorPkgModule[path])
|
||||||
|
dirs = append(dirs, vendorDir)
|
||||||
|
roots = append(roots, modRoot)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(dirs) > 1 {
|
if len(dirs) > 1 {
|
||||||
|
|
|
||||||
|
|
@ -673,7 +673,7 @@ func LoadModFile(ctx context.Context) *Requirements {
|
||||||
modfetch.WorkspaceGoSumFiles = append(modfetch.WorkspaceGoSumFiles, sumFile)
|
modfetch.WorkspaceGoSumFiles = append(modfetch.WorkspaceGoSumFiles, sumFile)
|
||||||
}
|
}
|
||||||
modfetch.GoSumFile = workFilePath + ".sum"
|
modfetch.GoSumFile = workFilePath + ".sum"
|
||||||
} else if modRoots == nil {
|
} else if len(modRoots) == 0 {
|
||||||
// We're in module mode, but not inside a module.
|
// We're in module mode, but not inside a module.
|
||||||
//
|
//
|
||||||
// Commands like 'go build', 'go run', 'go list' have no go.mod file to
|
// 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
|
pruning = workspace
|
||||||
}
|
}
|
||||||
requirements = newRequirements(pruning, nil, nil)
|
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
|
return requirements
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue