Go语言编写的开源CLI环境管理工具

Go语言编写的开源CLI环境管理工具 大家好。我为开发者们制作了一个命令行环境管理工具。你可以基于你的分支(生产、开发、测试……)来管理环境密钥,更多其他功能即将推出。

我对Go语言还比较陌生。这是我制作的第一款命令行应用程序。我很想听听大家的反馈、未来的改进建议以及其他任何意见。

GitHub仓库:https://github.com/mirislomovmirjalol/DotEM

1 回复

这是一个很棒的Go语言CLI项目!代码结构清晰,使用了Cobra框架构建命令行应用,这是一个很好的选择。以下是一些技术层面的观察:

代码亮点:

  1. 使用Cobra框架,符合Go语言CLI工具的最佳实践
  2. 环境变量管理逻辑封装得当
  3. 支持多分支(生产、开发、测试)的环境配置

示例改进建议:

当前的环境变量设置可以进一步优化。以下是使用os/exec包更健壮的实现示例:

func setEnvVars(envVars map[string]string) error {
    for key, value := range envVars {
        if err := os.Setenv(key, value); err != nil {
            return fmt.Errorf("failed to set %s: %w", key, err)
        }
        // 验证环境变量是否设置成功
        if os.Getenv(key) != value {
            return fmt.Errorf("environment variable %s not properly set", key)
        }
    }
    return nil
}

配置管理增强示例:

考虑添加配置验证功能:

func validateConfig(config *Config) error {
    if config.Branch == "" {
        return errors.New("branch name cannot be empty")
    }
    
    for key, value := range config.EnvVars {
        if strings.TrimSpace(key) == "" {
            return fmt.Errorf("environment key cannot be empty")
        }
        if strings.Contains(key, " ") {
            return fmt.Errorf("environment key cannot contain spaces: %s", key)
        }
        if strings.TrimSpace(value) == "" {
            log.Printf("warning: environment value for %s is empty", key)
        }
    }
    
    return nil
}

错误处理改进:

当前代码中的错误处理可以更具体:

func loadConfig(filePath string) (*Config, error) {
    data, err := os.ReadFile(filePath)
    if err != nil {
        if os.IsNotExist(err) {
            return nil, fmt.Errorf("config file not found: %s", filePath)
        }
        if os.IsPermission(err) {
            return nil, fmt.Errorf("permission denied reading: %s", filePath)
        }
        return nil, fmt.Errorf("failed to read config: %w", err)
    }
    
    var config Config
    if err := json.Unmarshal(data, &config); err != nil {
        return nil, fmt.Errorf("invalid JSON format: %w", err)
    }
    
    return &config, nil
}

并发安全考虑:

如果未来需要支持并发访问,可以考虑:

type EnvManager struct {
    mu     sync.RWMutex
    envVars map[string]string
}

func (e *EnvManager) Set(key, value string) {
    e.mu.Lock()
    defer e.mu.Unlock()
    e.envVars[key] = value
}

func (e *EnvManager) Get(key string) (string, bool) {
    e.mu.RLock()
    defer e.mu.RUnlock()
    val, ok := e.envVars[key]
    return val, ok
}

项目基础很好,继续完善错误处理、配置验证和测试用例会让工具更加健壮。期待看到更多功能的实现!

回到顶部