diff --git a/src/cmd/go/internal/cache/default.go b/src/cmd/go/internal/cache/default.go index eec2be9fa0..b2dd69edc5 100644 --- a/src/cmd/go/internal/cache/default.go +++ b/src/cmd/go/internal/cache/default.go @@ -78,9 +78,20 @@ func DefaultDir() (string, bool, error) { // otherwise distinguish between an explicit "off" and a UserCacheDir error. defaultDirOnce.Do(func() { - defaultDir = cfg.Getenv("GOCACHE") - if defaultDir != "" { - defaultDirChanged = true + // Compute default location. + dir, err := os.UserCacheDir() + if err != nil { + defaultDir = "off" + defaultDirErr = fmt.Errorf("GOCACHE is not defined and %v", err) + } else { + defaultDir = filepath.Join(dir, "go-build") + } + + newDir := cfg.Getenv("GOCACHE") + if newDir != "" { + defaultDirErr = nil + defaultDirChanged = newDir != defaultDir + defaultDir = newDir if filepath.IsAbs(defaultDir) || defaultDir == "off" { return } @@ -88,16 +99,6 @@ func DefaultDir() (string, bool, error) { defaultDirErr = fmt.Errorf("GOCACHE is not an absolute path") return } - - // Compute default location. - dir, err := os.UserCacheDir() - if err != nil { - defaultDir = "off" - defaultDirChanged = true - defaultDirErr = fmt.Errorf("GOCACHE is not defined and %v", err) - return - } - defaultDir = filepath.Join(dir, "go-build") }) return defaultDir, defaultDirChanged, defaultDirErr diff --git a/src/cmd/go/testdata/script/env_changed.txt b/src/cmd/go/testdata/script/env_changed.txt index 10db765407..5ba13b4dbf 100644 --- a/src/cmd/go/testdata/script/env_changed.txt +++ b/src/cmd/go/testdata/script/env_changed.txt @@ -67,6 +67,11 @@ env GOROOT=./b go env -changed ! stdout 'GOTOOLCHAIN=''?local''?' +[GOOS:windows] env LocalAppData=C:\ +[GOOS:windows] env GOCACHE=C:\go-build +[GOOS:windows] go env -changed +[GOOS:windows] ! stdout 'GOCACHE' + -- a/go.env -- GOPROXY=s GOAMD64=v1