123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- package util
- import (
- "fmt"
- "os"
- "path"
- "path/filepath"
- "strings"
- "github.com/tal-tech/go-zero/tools/goctl/vars"
- )
- const (
- pkgSep = "/"
- goModeIdentifier = "go.mod"
- )
- // JoinPackages calls strings.Join and returns
- func JoinPackages(pkgs ...string) string {
- return strings.Join(pkgs, pkgSep)
- }
- // MkdirIfNotExist makes directories if the input path is not exists
- func MkdirIfNotExist(dir string) error {
- if len(dir) == 0 {
- return nil
- }
- if _, err := os.Stat(dir); os.IsNotExist(err) {
- return os.MkdirAll(dir, os.ModePerm)
- }
- return nil
- }
- // PathFromGoSrc returns the path whihout slash where has been trim the prefix $GOPATH
- func PathFromGoSrc() (string, error) {
- dir, err := os.Getwd()
- if err != nil {
- return "", err
- }
- gopath := os.Getenv("GOPATH")
- parent := path.Join(gopath, "src", vars.ProjectName)
- pos := strings.Index(dir, parent)
- if pos < 0 {
- return "", fmt.Errorf("%s is not in GOPATH", dir)
- }
- // skip slash
- return dir[len(parent)+1:], nil
- }
- // FindGoModPath returns the path in project where has file go.mod, it maybe return empty string if
- // there is no go.mod file in project
- func FindGoModPath(dir string) (string, bool) {
- absDir, err := filepath.Abs(dir)
- if err != nil {
- return "", false
- }
- absDir = strings.ReplaceAll(absDir, `\`, `/`)
- var rootPath string
- var tempPath = absDir
- var hasGoMod = false
- for {
- if FileExists(filepath.Join(tempPath, goModeIdentifier)) {
- rootPath = strings.TrimPrefix(absDir[len(tempPath):], "/")
- hasGoMod = true
- break
- }
- if tempPath == filepath.Dir(tempPath) {
- break
- }
- tempPath = filepath.Dir(tempPath)
- if tempPath == string(filepath.Separator) {
- break
- }
- }
- if hasGoMod {
- return rootPath, true
- }
- return "", false
- }
- // FindProjectPath returns the parent directory where has file go.mod in project
- func FindProjectPath(loc string) (string, bool) {
- var dir string
- if strings.IndexByte(loc, '/') == 0 {
- dir = loc
- } else {
- wd, err := os.Getwd()
- if err != nil {
- return "", false
- }
- dir = filepath.Join(wd, loc)
- }
- for {
- if FileExists(filepath.Join(dir, goModeIdentifier)) {
- return dir, true
- }
- dir = filepath.Dir(dir)
- if dir == "/" {
- break
- }
- }
- return "", false
- }
|