| // Copyright 2017 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| // Package basedir finds templates and static files associated with a binary. | |
| package basedir | |
| import ( | |
| "bytes" | |
| "os" | |
| "os/exec" | |
| "path/filepath" | |
| "runtime" | |
| "strings" | |
| ) | |
| // Find locates a directory for the given package. | |
| // pkg should be the directory that contains the templates and/or static directories. | |
| // If pkg cannot be found, an empty string will be returned. | |
| func Find(pkg string) string { | |
| cmd := exec.Command("go", "list", "-e", "-f", "{{.Dir}}", pkg) | |
| if out, err := cmd.Output(); err == nil && len(out) > 0 { | |
| return string(bytes.TrimRight(out, "\r\n")) | |
| } | |
| gopath := os.Getenv("GOPATH") | |
| if gopath == "" { | |
| gopath = defaultGOPATH() | |
| } | |
| if gopath != "" { | |
| for _, dir := range strings.Split(gopath, ":") { | |
| p := filepath.Join(dir, pkg) | |
| if _, err := os.Stat(p); err == nil { | |
| return p | |
| } | |
| } | |
| } | |
| return "" | |
| } | |
| // Copied from go/build/build.go | |
| func defaultGOPATH() string { | |
| env := "HOME" | |
| if runtime.GOOS == "windows" { | |
| env = "USERPROFILE" | |
| } else if runtime.GOOS == "plan9" { | |
| env = "home" | |
| } | |
| if home := os.Getenv(env); home != "" { | |
| def := filepath.Join(home, "go") | |
| if filepath.Clean(def) == filepath.Clean(runtime.GOROOT()) { | |
| // Don't set the default GOPATH to GOROOT, | |
| // as that will trigger warnings from the go tool. | |
| return "" | |
| } | |
| return def | |
| } | |
| return "" | |
| } |