1

この 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.godeviceUUID変数はローカル フラグにバインドされます。

func init() {
    rootCmd.AddCommand(serveCmd)

    serveCmd.Flags().StringVar(&deviceUUID, "deviceUUID", "serveDeviceUUID", "Device UUID")
    fmt.Println("deviceUUID after serve init:", deviceUUID)
}

問題は、コマンド ラインでフラグconfigを指定せずにコマンドを実行すると、コマンドからデフォルト値が取得されることです。deviceUUIDserve

> go run main.go config
deviceUUID after config init: configDeviceUUID
deviceUUID after serve init: serveDeviceUUID
deviceUUID: serveDeviceUUID
config called

起こっているように見えるのはinit()、各ファイルの関数がアルファベット順に実行され、最後に実行された関数がフラグのデフォルト値を設定することです。

この動作を回避するにはどうすればよいですか? config.go設定されたデフォルト値が常にコマンドに適用されるようにしたいと思いますconfigconfigDeviceUUID(もちろん、 と のように個別の変数を宣言することもできますserveDeviceUUIDが、これは少し面倒に思えます)。

4

1 に答える 1