fix(config): 调整配置加载优先级与项目配置覆盖
- 全局配置优先加载,项目级配置进行增量覆盖 - 环境变量保持最高优先级 - 移除项目根目录 config.yaml 与 configs/config.yaml 探测 - 根命令允许接收任意参数
This commit is contained in:
1 parent
4515e28efc
commit
5e2550a7d7
2 files changed
+18
-16
No files matched your search
+17
-16
@@ -31,37 +31,38 @@ func getConfigPath() (string, error) {
|
||||
return filepath.Join(dir, "config.yaml"), nil
|
||||
}
|
||||
|
||||
// LoadConfig 读取全局配置(优先使用环境变量,其次读取 yaml 文件)
|
||||
// LoadConfig 智能读取配置:
|
||||
// 1. 先读取用户全局配置 ~/.git-air/config.yaml (保证 APIKey 等全局生效)
|
||||
// 2. 若当前项目存在 .git-air.yaml 或 git-air.yaml,则进行项目级增量覆盖
|
||||
// 3. 环境变量最高优先级覆盖
|
||||
func LoadConfig() (*AppConfig, error) {
|
||||
cfg := &AppConfig{
|
||||
Provider: "gemini",
|
||||
Model: "gemini-3.7-flash",
|
||||
}
|
||||
|
||||
// 1. 优先探测当前项目根目录下的配置文件
|
||||
localCandidates := []string{"config.yaml", ".git-air.yaml", ".git-air.yml", "configs/config.yaml"}
|
||||
loaded := false
|
||||
// 1. 首先加载全局配置 ~/.git-air/config.yaml
|
||||
configPath, err := getConfigPath()
|
||||
if err == nil {
|
||||
if data, err := os.ReadFile(configPath); err == nil && len(data) > 0 {
|
||||
if err := yaml.Unmarshal(data, cfg); err != nil {
|
||||
// 全局配置错误可输出警告或直接返回错误
|
||||
return nil, fmt.Errorf("解析全局配置文件 [%s] 失败: %w", configPath, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 检查当前项目是否有专属于 git-air 的配置文件 (.git-air.yaml / git-air.yaml) 进行增量覆盖
|
||||
localCandidates := []string{".git-air.yaml", ".git-air.yml", "git-air.yaml"}
|
||||
for _, name := range localCandidates {
|
||||
if data, err := os.ReadFile(name); err == nil && len(data) > 0 {
|
||||
if err := yaml.Unmarshal(data, cfg); err != nil {
|
||||
return nil, fmt.Errorf("解析配置文件失败: %w", err)
|
||||
return nil, fmt.Errorf("解析项目配置文件 [%s] 失败: %w", name, err)
|
||||
}
|
||||
loaded = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
// 2. 如果项目根目录下没有,则回退读取用户全局配置 ~/.git-air/config.yaml
|
||||
if !loaded {
|
||||
configPath, err := getConfigPath()
|
||||
if err == nil {
|
||||
if data, err := os.ReadFile(configPath); err == nil {
|
||||
_ = yaml.Unmarshal(data, cfg)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. 环境变量最高优先级覆盖
|
||||
if envKey := os.Getenv("GIT_AIR_API_KEY"); envKey != "" {
|
||||
cfg.APIKey = envKey
|
||||
|
||||
@@ -16,6 +16,7 @@ var rootCmd = &cobra.Command{
|
||||
Short: "git-air: 极轻量、极速的 Git 原生 AI 代码评审工具",
|
||||
Long: `git-air 是一个纯 Go 编写的 Git AI 评审利器。
|
||||
支持一键评审暂存区、指定 Commit、分支差异或单文件,无缝兼容 Gemini、DeepSeek、Ollama 和 OpenAI。`,
|
||||
Args: cobra.ArbitraryArgs,
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
ctx := cmd.Context()
|
||||
|
||||
|
||||
Reference in new issue
Block a user