为 go-kratos 框架开发了一个配置与命令行参数绑定的插件

查看 6|回复 0
作者:aapeli   
🎉 protoc-gen-go-flags 现已开源,欢迎大家 Star
https://github.com/kunstack/protoc-gen-go-flags
protoc-gen-go-flags 插件主要逻辑:
[ol]
  • 解析 .proto 消息结构
  • 映射 Protobuf 类型到 Go pflag 类型
  • 生成带有 AddFlags 方法的 .flags.go 文件
    [/ol]
    下面是一个简单的的示例:
    1. 定义数据结构 (config.proto)
    syntax = "proto3";
    package config;
    import "flags/annotations.proto";
    option go_package = "github.com/example/config;config";
    message Server {
      // 允许为空消息生成 AddFlags 方法
      option (flags.allow_empty) = true;
      string host = 1 [(flags.value).string = {
        name: "host"
        short: "H"
        usage: "Server host address"
        default: "localhost"
      }];
      int32 port = 2 [(flags.value).int32 = {
        name: "port"
        short: "p"
        usage: "Server port number"
        default: 8080
      }];
      bool debug = 3 [(flags.value).bool = {
        name: "debug"
        short: "d"
        usage: "Enable debug mode"
      }];
    }
    2. 生成代码
    在命令行中执行生成指令:
    protoc -I. \
      --go_out=. --go_opt=paths=source_relative \
      --flags_out=. --flags_opt=paths=source_relative \
      config.proto
    3. 构建应用 (main.go)
    生成的代码能够无缝集成到 Cobra 或标准 pflag 中:
    package main
    import (
        "fmt"
        "os"
        "github.com/spf13/pflag"
        pb "github.com/example/config"
    )
    func main() {
        cfg := &pb.Server{}
        // 设置默认值(可选但推荐)
        cfg.SetDefaults()
        // 创建独立的 FlagSet ,避免污染全局标志
        fs := pflag.NewFlagSet("server", pflag.ExitOnError)
        // 核心魔法:一行代码完成所有 Flag 的注册
        // 自动生成: --host, --port, --debug
        cfg.AddFlags(fs)
        // 解析命令行参数
        if err := fs.Parse(os.Args[1:]); err != nil {
            fmt.Fprintf(os.Stderr, "Error parsing flags: %v\n", err)
            os.Exit(1)
        }
        fmt.Printf("Server starting at %s:%d (Debug: %v)\n",
            cfg.Host, cfg.Port, cfg.Debug)
    }
    3. 使用示例
    使用示例如下:
    ./app --host=127.0.0.1 --port=8080 --debug
    高级用法可以参考下文档
    https://github.com/kunstack/protoc-gen-go-flags/tree/main/examples
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部