这个 Cobra 应用程序示例https://github.com/kurtpeek/myCobraApp包含一个 Cobra 应用程序,它使用 Cobra 生成器和以下命令搭建而成:
cobra add serve
cobra add config
目录结构为
.
├── LICENSE
├── cmd
│ ├── config.go
│ ├── root.go
│ └── serve.go
├── go.mod
├── go.sum
└── main.go
在config.go
中,字符串变量deviceUUID
被定义并绑定到该命令的标志,默认值为"configDeviceUUID"
:
var deviceUUID string
func init() {
rootCmd.AddCommand(configCmd)
// Cobra supports local flags which will only run when this command
// is called directly, e.g.:
configCmd.Flags().StringVar(&deviceUUID, "deviceUUID", "configDeviceUUID", "Device UUID")
fmt.Println("deviceUUID after config init:", deviceUUID)
}
同样,在serve.go
变量deviceUUID
中绑定一个本地标志:
func init() {
rootCmd.AddCommand(serveCmd)
serveCmd.Flags().StringVar(&deviceUUID, "deviceUUID", "serveDeviceUUID", "Device UUID")
fmt.Println("deviceUUID after serve init:", deviceUUID)
}
问题是,如果我运行config
命令而不deviceUUID
在命令行中指定标志,它会从命令中获取默认值serve
:
> go run main.go config
deviceUUID after config init: configDeviceUUID
deviceUUID after serve init: serveDeviceUUID
deviceUUID: serveDeviceUUID
config called
似乎正在发生的事情是init()
每个文件中的函数按字母顺序运行,最后一个运行的函数设置了标志的默认值。
我怎样才能避免这种行为?我希望设置的默认值config.go
始终应用于config
命令。(当然,我可以声明单独的变量,例如configDeviceUUID
and serveDeviceUUID
,但这对我来说似乎有点混乱)。