Gérer les variables d'environnement Go (viper)

introduction

Il existe une bibliothèque appelée viper qui simplifie le fichier de paramètres d'environnement avec golang. Cette fois, je vais vous présenter brièvement comment utiliser la vipère

viper Essayez d'utiliser simplement viper Cette fois, nous allons la mapper à une structure et l'implémenter afin qu'elle puisse être acheminée et utilisée.

Arbre source


.
├── config
│   ├── config.yaml
│   └── definition.go
└── main.go

config.yaml


#Fichier Yaml pour définir les variables d'environnement
user: 
  name: "kosuke"

À l'origine, le nom d'utilisateur de la base de données est souvent entré, mais cette fois, les variables d'environnement ci-dessus sont facilement définies.

definition.go


package config

import (
	"fmt"

	"github.com/spf13/viper"
)

//Structure pour la cartographie
type Config struct {
	User User   `yaml:user`
}

type User struct {
	Name string `yaml:"name"`
}

func Load() (*Config, error) {
	viper.SetConfigName("config")   //Spécifiez le nom du fichier de paramètres
	viper.SetConfigType("yaml")     //Spécifiez le format du fichier de paramètres
	viper.AddConfigPath("config/")  //Spécifiez le chemin du fichier

	err := viper.ReadInConfig()     //Rechercher et lire le fichier de configuration
	if err != nil {            
		return nil, fmt.Errorf("Erreur de lecture du fichier de configuration: %s \n", err)
	}

	var cfg Config

	err = viper.Unmarshal(&cfg)
	if err != nil {
		return nil, fmt.Errorf("unmarshal error: %s \n", err)
	}

	return &cfg, nil
}

Dans la fonction appelée Load (), recherchez le fichier de variable d'environnement et mappez la variable d'environnement à la structure appelée Config.

main.go


package main

import (
	"fmt"
	"viper-test/config"
)

func main() {
	cfg, err := config.Load()
	if err != nil {
		panic(err)
	}

	fmt.Println(cfg.User.Name)
}

Cette fois, j'affiche simplement le contenu de Config pour m'assurer que la structure contient des données, Normalement, nous prendrons cette structure comme argument et établirons une connexion DB.

$ go run main.go
kosuke

En outre, lorsque vous travaillez dans un environnement de production, vous souhaiterez peut-être recevoir des variables d'environnement de l'extérieur. Dans ce cas, ...

definition.go


package config

import (
	"fmt"

	"github.com/spf13/viper"
)

//Structure pour la cartographie
type Config struct {
	User User   `yaml:user`
}

type User struct {
	Name string `yaml:"name"`
}

func Load() (*Config, error) {
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("config/")

    // ===========↓ Addendum=============
    //Si la variable d'environnement est déjà spécifiée, donnez-lui la priorité.
	viper.AutomaticEnv()            

    //Paramètres de basculement de la structure de données vers un cas de chameau
	viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
    // ===========↑ Jusqu'ici=============

	err := viper.ReadInConfig()
	if err != nil {            
		return nil, fmt.Errorf("Erreur de lecture du fichier de configuration: %s \n", err)
	}

	var cfg Config

	err = viper.Unmarshal(&cfg)
	if err != nil {
		return nil, fmt.Errorf("unmarshal error: %s \n", err)
	}

	return &cfg, nil
}

En utilisant la syntaxe ci-dessus, lorsque la variable d'environnement est spécifiée, ce n'est pas la valeur du fichier de configuration, Vous pouvez voir la valeur de la variable d'environnement

python


#Compte tenu des variables d'environnement`go run`
$ USER_NAME=tarou go run main.go
tarou

À la fin

Cette fois, c'était une utilisation très simple, mais je pense qu'il est très facile de mapper des variables d'environnement sur des structures et de les acheminer car vous n'avez pas à écrire de traitement supplémentaire. Bien entendu, je voudrais être prudent lors de l'utilisation d'informations confidentielles (telles que les clés d'accès AWS).

Matériel de référence

Recommended Posts

Gérer les variables d'environnement Go (viper)
Gérer les variables d'environnement en Python
Variables shell, variables d'environnement
Que sont les variables d'environnement? (Linux)
Variables d'environnement HTTP dans Flask
Comment définir les variables Go
Construction de l'environnement, construction -Go-
Définir des variables d'environnement avec lambda-uploader
Créer un environnement go à l'aide de Docker
Essayez de fournir des variables d'environnement AWS Lambda?
Lire les variables d'environnement système avec python-partie 1
Lire les variables d'environnement système avec python-partie 2