【问题标题】:Removal of key-value pair from viper config file从 viper 配置文件中删除键值对
【发布时间】:2018-09-14 21:21:46
【问题描述】:

有没有办法从加载的配置文件中删除键/值对?

viper.Set("key", nil)

没用

【问题讨论】:

  • 据我所知,没有办法删除东西,但你可以有选择地设置东西。这需要更多的工作,但在这种情况下可能是必要的。使用viper.New 创建一个新的*viper.Viper 并加载您的配置,覆盖配置设置,对于您想要启用的设置,使用viper.Set 在全局Viper 实例上手动设置它们。这种方法也可以根据需要应用于其他配置源,尽管将它们合并在一起显然会涉及更多工作(理想情况下,您应该为源使用与 viper 相同的优先级。)只是一个想法。

标签: go viper-go


【解决方案1】:

试试

delete(viper.Get("path.to.key").(map[string]interface{}), "key")

例子:

[backends]
  [backends.setibe]
    [backends.setibe.servers]
      [backends.setibe.servers.server0]
      url = "http://192.168.1.20:80"
      weight = 1
      [backends.setibe.servers.server1]
      url = "http://192.168.1.21:80"
      weight = 1

删除“backends.setibe.servers.server1”

delete(viper.Get("backends.setibe.servers").(map[string]interface{}), "server2")

【讨论】:

  • 这似乎不适用于最新版本的 Viper 1.7.0。
【解决方案2】:

基于@user539810 的评论,我有以下内容:

var rootCmd = &cobra.Command{
    //...
    PersistentPreRunE: writeConfig, //if --writeCfg, write viper config file and exit
}
func writeConfig(cmd *cobra.Command, args []string) error {
    if !writeCfg {
        return nil
    }
    cfg := viper.New()
    for k, v := range viper.AllSettings() {
        switch k {
        case "writecfg", "config", "dryrun":
            //do not propagate these
        default:
            //TODO: also check for zero values and exclude
            cfg.Set(k, v)
        }
    }
    if cfgFile == "" {
        filename := "." + os.Args[0] + ".yaml"
        home, err := os.UserHomeDir()
        cobra.CheckErr(err)
        cfgFile = filepath.Join(home, filename)
    }

    cfg.SetConfigFile(cfgFile)
    var err error
    if _, err = os.Stat(cfgFile); err != nil {
        err = os.WriteFile(cfgFile, nil, 0644)
        cobra.CheckErr(err)
    }
    err = cfg.WriteConfig()
    cobra.CheckErr(err)
    fmt.Println("config written successfully:")
    f, err := os.Open(cfgFile)
    cobra.CheckErr(err)
    defer f.Close()
    _, err = io.Copy(os.Stdout, f)
    cobra.CheckErr(err)
    os.Exit(0)
    return nil //unreachable
}

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2013-09-26
    相关资源
    最近更新 更多