зеркало из https://github.com/golang/build.git
59 строки
1.4 KiB
Go
59 строки
1.4 KiB
Go
// 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 ""
|
|
}
|