对于我正在尝试使用Viper传递stings地图作为环境变量的项目。我尝试了几种方法来实现这一目标但没有成功。当我从代码中读取env变量时,它是空的。这是我使用的代码:
// To configure viper
viper.SetEnvPrefix("CONFIG")
viper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
// To read the configuration value I tried all this variants:
fmt.Print(viper.GetString("options.values"))
fmt.Print(viper.GetStringMapString("options.values"))
fmt.Print(viper.GetStringMap("options.values"))
这就是我传递价值的方式:
CONFIG_OPTIONS_VALUES_ROOT =""
我也尝试过:
CONFIG_OPTIONS_VALUES =" {\" root \":\"。\",\" cmd \":\&#34 ; exec \",\" logging \":\" on \"}"
我想在env变量中处理值传递的方式是:
values := viper.GetStringMapString("options.values")
for key, val := range values {
fmt.Printf("Key: %s, Value: %s", key, val)
}
如果我在配置文件中编写此配置并使用viper读取它,我可以完美地做到这一点:
options:
values:
root: .
cmd: exec
logging: on
#more values can be added here
希望有人能在这里指出我正确的方向。
答案 0 :(得分:1)
我一直在调查,似乎你没有正确设置你的环境变量的值,以及你如何用viper调用它。在下面找到一个例子,并随意评论你的想法:
package main
import (
"bytes"
"fmt"
"github.com/spf13/viper"
"strings"
)
func main() {
//Configure the type of the configuration as JSON
viper.SetConfigType("json")
//Set the environment prefix as CONFIG
viper.SetEnvPrefix("CONFIG")
viper.AutomaticEnv()
//Substitute the _ to .
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
//Get the string that is set in the CONFIG_OPTIONS_VALUES environment variable
var jsonExample = []byte(viper.GetString("options.values"))
viper.ReadConfig(bytes.NewBuffer(jsonExample))
//Convert the sub-json string of the options field in map[string]string
fmt.Println(viper.GetStringMapString("options"))
}
以及如何致电:
CONFIG_OPTIONS_VALUES="{\"options\": {\"root\": \".\", \"cmd\": \"exec\", \"logging\": \"on\"}}" go run main.go