2

我有一个带有我想重命名的标志名称的 CLI,但我也想这样做,以便此更改向后兼容并且使用旧标志名称仍然有效,如下所示:

# New flag name
root subcommand --no-color

# Old flag name still works
root subcommand --nocolour

我最初的想法是将标志名称别名为新名称,如此所述。这种方法确实将标志名称更改为新名称,但它不会这样做,因此您也可以使用标志的旧名称。

我已经采取了一种方法来解决这个问题,方法是定义另一个具有相同属性但名称不同的标志,并将速记移动到新标志,如下所示:

// Old flag name
cmd.PersistentFlags().BoolP(
    "nocolour", "", false,
    "disable colouring (default: false)")

// New flag name
cmd.PersistentFlags().BoolP(
    "no-color", "C", false,
    "disable coloring (default: false)")

然后我将旧名称标志标记为隐藏:

cmd.PersistentFlags().MarkHidden("nocolour")

我想知道是否有一种方法可以完成我上面所做的事情而不必定义和支持两个标志?

4

1 回答 1

0

我使用SetNormalizeFunccobra 提供的功能将旧标志值重命名为新标志值。

func addFlags() {
    // Define a new flag `ignore-var-run` and use the same variable opts.IgnoreVarRun to capture the flag value.
    RootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, "ignore-var-run", "", true, "Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image. (Default true).")
    
    // Keep the old flag `whitelist-var-run` as is.
    RootCmd.PersistentFlags().BoolVarP(&opts.IgnoreVarRun, "whitelist-var-run", "", true, "Ignore /var/run directory when taking image snapshot. Set it to false to preserve /var/run/ in destination image. (Default true).")
    
    // Mark the old flag as deprecated. 
    RootCmd.PersistentFlags().MarkDeprecated("whitelist-var-run", "please use ignore-var-run instead.")

    // SetNormalize function to translate the use of `whitelist-var-run` to `ignore-var-run`
    RootCmd.PersistentFlags().SetNormalizeFunc(normalizeWhitelistVarRun)
}

func normalizeWhitelistVarRun(f *pflag.FlagSet, name string) pflag.NormalizedName {
    switch name {
    case "whitelist-var-run":
        name = "ignore-var-run"
        break
    }
    return pflag.NormalizedName(name)
}

这是此https://github.com/GoogleContainerTools/kaniko/pull/1668/的 PR

于 2021-06-10T23:57:42.597 回答