cmd/go: avoid setting mod=vendor in workspace mode

Workspaces with a single module would enter mod=vendor mode even when
in workspace mode. Fix that by explicitly checking that we're not in
workspace mode when deciding whether to enter vendor mode.

Fixes #54130

Change-Id: I03fcd9db4160c9872aa2b7957a80f24d49f787d0
Reviewed-on: https://go-review.googlesource.com/c/go/+/439415
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-10-05 19:06:23 -04:00
parent 498ee73a4b
commit 005c78d8bb
2 changed files with 57 additions and 1 deletions

View File

@ -1154,7 +1154,7 @@ func setDefaultBuildMod() {
return
}
if len(modRoots) == 1 {
if len(modRoots) == 1 && !inWorkspaceMode() {
index := MainModules.GetSingleIndexOrNil()
if fi, err := fsys.Stat(filepath.Join(modRoots[0], "vendor")); err == nil && fi.IsDir() {
modGo := "unspecified"

View File

@ -0,0 +1,56 @@
# Test that mod=vendor is disabled in workspace mode, even
# with a single workspace module.
cd workspace
# Base case: ensure the module would default to mod=vendor
# outside of workspace mode.
env GOWORK=off
go list -f '{{.Dir}}' example.com/dep
stdout $GOPATH[\\/]src[\\/]workspace[\\/]vendor[\\/]example.com[\\/]dep
# Test case: endure the module does not enter mod=vendor outside
# worspace mode.
env GOWORK=''
go list -f '{{.Dir}}' example.com/dep
stdout $GOPATH[\\/]src[\\/]dep
-- workspace/go.work --
use .
replace example.com/dep => ../dep
-- workspace/main.go --
package main
import "example.com/dep"
func main() {
dep.Dep()
}
-- workspace/go.mod --
module example.com/mod
go 1.20
require example.com/dep v1.0.0
-- workspace/vendor/example.com/dep/dep.go --
package dep
import "fmt"
func Dep() {
fmt.Println("the vendored dep")
}
-- workspace/vendor/modules.txt --
# example.com/dep v1.0.0
## explicit
example.com/dep
-- dep/go.mod --
module example.com/dep
-- dep/dep.go --
package dep
import "fmt"
func Dep () {
fmt.Println("the real dep")
}