77 lines
1.9 KiB
Go
77 lines
1.9 KiB
Go
|
|
package config
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
"os"
|
|||
|
|
"path/filepath"
|
|||
|
|
"strings"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
const (
|
|||
|
|
// ConfigDirName 配置目录名称
|
|||
|
|
ConfigDirName = "yoyo"
|
|||
|
|
// ConfigFileName 配置文件名
|
|||
|
|
ConfigFileName = "config.yaml"
|
|||
|
|
// EnvFileName 环境变量文件名
|
|||
|
|
EnvFileName = ".env"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// ResolveConfigPath 解析配置文件路径
|
|||
|
|
// 优先级: 用户指定路径 > ~/.config/yoyo/config.yaml > ./configs/config.yaml
|
|||
|
|
func ResolveConfigPath(userPath string) (string, error) {
|
|||
|
|
// 1. 用户通过 --config 指定的路径
|
|||
|
|
if userPath != "" {
|
|||
|
|
return expandPath(userPath)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 标准用户配置目录 ~/.config/yoyo/config.yaml
|
|||
|
|
userConfigPath := GetUserConfigPath()
|
|||
|
|
if _, err := os.Stat(userConfigPath); err == nil {
|
|||
|
|
return userConfigPath, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 3. 项目本地配置 ./configs/config.yaml(向后兼容)
|
|||
|
|
localConfigPath := "configs/config.yaml"
|
|||
|
|
if _, err := os.Stat(localConfigPath); err == nil {
|
|||
|
|
return localConfigPath, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 4. 都不存在,返回标准路径(onboard 会创建)
|
|||
|
|
return userConfigPath, nil
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserConfigDir 获取用户配置目录路径
|
|||
|
|
// 返回 ~/.config/yoyo
|
|||
|
|
func GetUserConfigDir() string {
|
|||
|
|
home, err := os.UserHomeDir()
|
|||
|
|
if err != nil {
|
|||
|
|
// 降级到当前目录
|
|||
|
|
return ".config/" + ConfigDirName
|
|||
|
|
}
|
|||
|
|
return filepath.Join(home, ".config", ConfigDirName)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserConfigPath 获取用户配置文件路径
|
|||
|
|
// 返回 ~/.config/yoyo/config.yaml
|
|||
|
|
func GetUserConfigPath() string {
|
|||
|
|
return filepath.Join(GetUserConfigDir(), ConfigFileName)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// GetUserEnvPath 获取用户环境变量文件路径
|
|||
|
|
// 返回 ~/.config/yoyo/.env
|
|||
|
|
func GetUserEnvPath() string {
|
|||
|
|
return filepath.Join(GetUserConfigDir(), EnvFileName)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// expandPath 展开路径中的 ~ 符号
|
|||
|
|
func expandPath(path string) (string, error) {
|
|||
|
|
if strings.HasPrefix(path, "~") {
|
|||
|
|
home, err := os.UserHomeDir()
|
|||
|
|
if err != nil {
|
|||
|
|
return "", fmt.Errorf("无法获取用户主目录: %w", err)
|
|||
|
|
}
|
|||
|
|
path = filepath.Join(home, path[1:])
|
|||
|
|
}
|
|||
|
|
return path, nil
|
|||
|
|
}
|