diff --git a/internal/build/build.go b/internal/build/build.go index e7174e3ed..a6bc69e63 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -18,6 +18,7 @@ package build import ( "archive/zip" + "errors" "fmt" "go/constant" "go/token" @@ -70,7 +71,11 @@ type Config struct { func NewDefaultConf(mode Mode) *Config { bin := os.Getenv("GOBIN") if bin == "" { - bin = filepath.Join(runtime.GOROOT(), "bin") + gopath, err := envGOPATH() + if err != nil { + panic(fmt.Errorf("cannot get GOPATH: %v", err)) + } + bin = filepath.Join(gopath, "bin") } conf := &Config{ BinPath: bin, @@ -80,6 +85,25 @@ func NewDefaultConf(mode Mode) *Config { return conf } +func envGOPATH() (string, error) { + env := "HOME" + switch runtime.GOOS { + case "windows": + env = "USERPROFILE" + case "plan9": + env = "home" + } + home := os.Getenv(env) + if home == "" { + return "", fmt.Errorf("%s is not set", env) + } + def := filepath.Join(home, "go") + if filepath.Clean(def) == filepath.Clean(runtime.GOROOT()) { + return "", errors.New("cannot set GOROOT as GOPATH") + } + return def, nil +} + func DefaultAppExt() string { if runtime.GOOS == "windows" { return ".exe"