この 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
(もちろん、 と のように個別の変数を宣言することもできますserveDeviceUUID
が、これは少し面倒に思えます)。