好的,感谢您提供的其他信息,它有很大帮助!
问题
问题出在您检索标志值的方式上。这是您目前拥有的:
bind := cmd.Flag("bind").Value.String()
fmt.Printf("Binding definition provided: %s\n", bind)
server.Listen(bind)
当用 viper 绑定一个标志时,实际上是 viper 将持有最终值,根据以下优先级:
1. If present, use the flag value
2. Else, use the value from the config file
3. Else, use the default flag value
您的问题是您从命令的标志集中检索标志值,而不是从毒蛇。
行为
这是我测试的代码:
bind := cmd.Flag("bind").Value.String()
fmt.Printf("Binding definition provided: %s\n", bind)
fmt.Printf("Binding definition provided from viper: %s\n", viper.GetString("bind"))
没有绑定配置参数:
$ go-logsink listen
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :50051
Binding definition provided from viper: :50051
将绑定配置参数设置为“bla”(不是嵌套的,第二个配置文件):
$ go-logsink listen
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :50051
Binding definition provided from viper: bla
将绑定配置参数设置为“bla”(不是嵌套的,第二个配置文件)和一个显式标志:
$ go-logsink listen --bind ":3333"
Using config file: /xxx/.go-logsink.yaml
Binding definition provided: :3333
Binding definition provided from viper: :3333
底线:当用 viper 绑定你的标志时,使用 viper 来检索它们。
附加说明:在您的 README 中,生成 grpc 兼容代码的正确方法是将 grpc 插件添加到 protobuf 生成中:protoc --go_out=plugins=grpc:. *.proto