3

私が取り組んでいるプロジェクトでは、Viper を使用して文字列のマップを環境変数として渡そうとしています。これを達成するためにいくつかのアプローチを試みましたが、成功しませんでした。コードから 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\": \"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 

誰かがここで私を正しい方向に向けてくれることを願っています。

4

1 に答える 1

2

私は少し調査してきましたが、環境変数の値が適切に設定されていないようで、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
于 2016-02-08T22:46:42.190 に答える