如何解决Cobra:在不使用包全局变量的情况下为子命令提供上下文?
我使用 cobra 和 viper 编写了一个简单的 CLI 工具。我最近一直在重构它以避免包全局变量,主要是因为使用例如建议的布局很难测试cobra init
。
代替...
var rootCmd = &cobra.Command{
...
}
func main() {
rootCmd.Execute()
}
我有更多类似的东西:
func NewCmdRoot() *cobra.Command {
cmd := &cobra.Command{
...
}
return cmd
}
func main() {
rootCmd := NewCmdRoot()
rootCmd.Execute()
}
这实际上效果很好,并且使测试更容易
从一组干净的 cli 选项开始。我遇到了一些
难以将 Viper 整合到新计划中。如果我只在乎
关于 root 命令,我可以在 PersistentPreRun
命令,像这样:
func initConfig(cmd *cobra.Command) {
config := viper.New()
rootCmd := cmd.Root()
config.BindPFlag("my-nifty-option",rootCmd.Flag("my-nifty-option")); err != nil {
// ...stuff happens here...
config.ReadInConfig()
// What happens next?
}
func NewCmdRoot() *cobra.Command {
cmd := &cobra.Command{
PersistentPreRun: func(cmd *cobra.Command,args []string) {
initConfig(cmd)
},}
这种工作:只要我只对配置选项感兴趣
对应于 Cobra 命令行选项,事情就像
预期的。但是如果我想访问 config
变量本身怎么办?
我不确定如何将 config
变量暴露在
initConfig
方法而不将其转换为全局包。我想要
实例化多个命令树的可能性,每个命令树都有
它是自己独立的 Viper 配置对象,但我不清楚该放在哪里
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。