props 解析各种 ini / yaml 等

最后更新于:2022-04-02 02:39:39

[TOC] > [github](https://github.com/tietang/props) ## 概述 ### 支持的配置源: * properties格式文件 * ini格式文件 * yaml格式文件 * [Apollo](https://github.com/ctripcorp/apollo)k/v,k/props,k/ini,k/yaml * [Nacos](http://nacos.io/)k/props\[properties\],k/yaml,k/ini,k/ini\_props * zookeeper k/v * zookeeper k/props\[properties\],k/yaml,k/ini,k/ini\_props * consul k/v * consul k/props\[properties\],k/yaml,k/ini,k/ini\_props * etcd API V2 k/v * etcd API V2 k/props * etcd API V3 k/v * etcd API V3 k/props ### key/value支持的数据类型: * key只支持string * value 5种数据类型的支持: * string * int * float64 * bool * time.Duration: * 比如 "300ms", "-1.5h" or "2h45m". * 合法的时间单位: "ns", "us" (or "µs"), "ms", "s", "m", "h". ### 其他特性 * Unmarshal支持 * 上下文变量eval支持,`${}`形式 * 支持多配置源组合 * 默认添加了系统环境变量,优先级最低 ## 安装 `go get -u github.com/tietang/props` ## 格式 ### properties `[key][=|:][value]` 例子: config.properties ``` server.port=8080 //or server.port: 8080 ``` #### kvs.ReadPropertyFile 从文件读取 ``` p, e := kvs.ReadPropertyFile("config.properties") p.Get("server.port") //8080 p.Get("prefix.key1") p.GetDefault("prefix.key1", "default value") p.GetBool("prefix.key2") p.GetBoolDefault("prefix.key2", false) p.GetInt("prefix.key3") p.GetIntDefault("prefix.key3", 1) p.GetFloat64("prefix.key4") p.GetFloat64Default("prefix.key4", 1.2) ``` #### kvs.NewProperties() 通过 io.reader ``` p := kvs.NewProperties() p.Load(strings.NewReader("server.port=8080\nserver.ip=127.0.0.1")) p.Get("server.ip") //127.0.0.1 ``` #### kvs.NewPropertiesConfigSource() ``` var cs kvs.ConfigSource cs = kvs.NewPropertiesConfigSource("conf/config.properties") cs.Get("server.port") //8080 var cs kvs.ConfigSource cs = kvs.NewPropertiesConfigSourceByFile("conf", "conf/config.properties") cs.Get("server.port") //8080 //向 map 中获取参数 var cs kvs.ConfigSource m := make(map[string]string) m["server.port"] = "8080" cs = kvs.NewPropertiesConfigSourceByMap("conf", m) cs.Get("server.port") //8080 ``` ### ini格式文件 格式: ``` [section] [key1][=|:][value1] [key1][=|:][value1] ``` ``` file := "conf/config.ini" p := ini.NewIniFileConfigSource(file) p = ini.NewIniFileConfigSourceByFile("name", file) s, _ := p.Get("server.port") ``` ### 上下文变量表达式(或者占位符)的支持 支持在props上下文中替换占位符:${} ``` p := kvs.NewEmptyMapConfigSource("map2") p.Set("orign.key1", "v1") p.Set("orign.key2", "v2") p.Set("orign.key3", "2") p.Set("ph.key1", "${orign.key1}") p.Set("ph.key2", "${orign.key1}:${orign.key2}") p.Set("ph.key3", "${orign.key3}") conf := kvs.NewDefaultCompositeConfigSource(p) phv1, err := conf.GetInt("ph.key1")//v1 phv2, err := conf.Get("ph.key2")//v1:v1 phv3, err := conf.GetInt("ph.key3")//2 ``` ### 多种配置源组合使用 优先级以追加相反的顺序,最后添加优先级最高。 ``` conf := kvs.NewEmptyCompositeConfigSource() kv1 := []string{"go.app.key1", "value1", "value1-2"} kv2 := []string{"go.app.key2", "value2", "value2-2"} p1 := kvs.NewEmptyMapConfigSource("map1") p1.Set(kv1[0], kv1[1]) // go.app.key1=value1 p1.Set(kv2[0], kv2[1]) // go.app.key1=value2 p2 := kvs.NewEmptyMapConfigSource("map2") p2.Set(kv1[0], kv1[2]) // go.app.key2=value1-2 p2.Set(kv2[0], kv2[2]) // go.app.key2=value2-2 conf.Add(p1) conf.Add(p2) conf.Get(kv1[0]) //value1-2 conf.Get(kv2[0]) //value2-2 ```
';