// Package util ... // // Description : util ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2022-10-14 12:39 package util import ( "os" "path/filepath" "runtime" "strings" "github.com/mitchellh/go-homedir" ) type project struct { } // GetExecutablePath 获取可执行文件的路径 func (p *project) GetExecutablePath() (string, error) { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) //返回绝对路径 filepath.Dir(os.Args[0])去除最后一个元素的路径 if err != nil { return "", err } return dir, nil } // GetFileSystemSeparator 获取当前文件系统的路径分隔符 func (p *project) GetFileSystemSeparator() string { return string(filepath.Separator) } // BuildPath 构建路径 func (p *project) BuildPath(filePathList ...string) string { projectRootPath, _ := p.GetExecutablePath() if p.IsRunningWithGoRun() { // go run 运行, 则工作目录为项目目录 projectRootPath = p.GetWorkDir() } if len(filePathList) == 0 { // 降为获取项目根目录 return projectRootPath } // 第一个特殊处理 if strings.ToLower(runtime.GOOS) == "windows" { // windows if !strings.Contains(filePathList[0], ":") { // 不包含 :, 是 相对路径,拼成绝对路径 filePathList[0] = filepath.Join(projectRootPath, filePathList[0]) } } else { // unix/ linux if !strings.HasPrefix(filePathList[0], p.GetFileSystemSeparator()) { // 不是绝对路径 filePathList[0] = filepath.Join(projectRootPath, filePathList[0]) } } return filepath.Join(filePathList...) } // GetWorkDir 获取工作目录 func (p *project) GetWorkDir() string { dir, _ := os.Getwd() return dir } // GetHomeDir 获取家目录 func (p *project) GetHomeDir() string { homePath, _ := homedir.Dir() return homePath } // IsRunningWithGoRun 获取程序是否通过 go run 运行 func (p *project) IsRunningWithGoRun() bool { // 方法1: 检查执行文件路径是否包含临时目录特征 exePath, err := os.Executable() if err != nil { return false } // go run 会在临时目录创建二进制文件 // 不同系统的临时目录特征: switch runtime.GOOS { case "windows": // Windows: 通常在 C:\Users\\AppData\Local\Temp\go-build\ return strings.Contains(exePath, "go-build") || strings.Contains(exePath, `\go-build\`) || strings.Contains(filepath.Base(exePath), "go-build") case "darwin", "linux": // macOS/Linux: 通常在 /tmp/go-build/ return strings.Contains(exePath, "/go-build/") || strings.Contains(exePath, "/go-build") || (strings.HasPrefix(exePath, "/var/folders/") && strings.Contains(exePath, "/go-build/")) } return false }