2016-02-08 3 views
1

Для проекта, над которым я работаю, я пытаюсь передать карту укусов в качестве переменной окружения, используя Viper. Я пробовал несколько подходов к достижению этого, но без успеха. Когда я читаю переменную env из кода, она пуста. Это код, я использую:Передача строковой карты как переменной окружения в Go using Viper

// 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 = "{\" корень \ ": \". \ "\ "ЦМД \": \ "ехес \", \ "лесозаготовительной \": \" на \ «}»

Я так хочу, чтобы обработать значение проходит в переменной окр является:

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

кажется, что ваша переменная окружения имя не то же самое, ключевое имя, которое вы используете для извлечения его значения, попробуйте с этим: 'fmt.Print (viper.GetString (" options.values.root "))' – JesusTinoco

+0

Это работает, но я не тот эффект, который я ищу для. В этом случае мне нужно заранее знать ключи карты значений. Я хочу обработать все значения в виде карты. Я добавлю к вопросу, чтобы сделать пример использования более понятным. – Diego

+0

Я добавил ответ, может быть, это может вам помочь. – JesusTinoco

ответ

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 
+0

Спасибо! это работает, но единственное предостережение в том, что я уже использую файл конфигурации yaml, а переменная env будет альтернативным способом передачи значений, поэтому я не могу переключиться на тип конфигурации JSON в viper. – Diego

+1

Вы можете добавить условие, которое проверяет, задана ли переменная окружения, если так изменить тип конфигурации в JSON, делать все, что захотите, и после ее завершения снова измените тип конфигурации на YML. – JesusTinoco

+0

Отлично, я дам ему попробовать и дам вам знать, спасибо! – Diego

Смежные вопросы