Gestionar variables de entorno
Tiempo de lectura: 1 minutos
Uso de ficheros de configuración para cargar variables de entorno que podemos utilizar en los programas
Variables de entorno
Las variables de entorno permiten ser definidas en ficheros separados del código y, a al vez, poder compartirlas entre diferentes aplicaciones. Por ejemplo, el acceso a una base de datos. Además, si se realiza un cambio en una variable o se cambia el nombre, no es necesario tocar nada de código.
Fichero de variables
Creamos un fichero .env, por ejemplo este para utilizarlo en el proyecto de servidor de ficheros. Necesitamos la base de datos, datos de administrador y tokens para JWT.
# Database credentials
DB_HOST="localhost"
DB_DRIVER=mysql
DB_USER="<<DB_USER>>"
DB_PASSWORD="<<DB_PASSWORD>>"
DB_NAME="<<DB_NAME>>"
DB_PORT="3306"
# Default Admin User
ADMIN_USERNAME="<<ADMIN_USERNAME>>"
ADMIN_EMAIL="<<ADMIN_EMAIL>>"
ADMIN_PASSWORD="<<ADMIN_PASSWORD>>"
# Authentication credentials
TOKEN_TTL="1800"
JWT_PRIVATE_KEY="<<JWT_KEY>>" Paquete godotenv
La forma más fácil de cargar el archivo .env es usando el paquete godotenv. Este es un paquete sencillo enfocado a esta carga.
go get github.com/joho/godotenv godotenv implementa un método Load para cargar los ficheros .env.
go get github.com/joho/godotenv Y lo cargamos en el programa
package main
import (
"github.com/joho/godotenv"
)
// carga el fichero .env y retorna el valor de la clave solicitada
func goDotEnvVariable(key string) string {
err := godotenv.Load(".env")
if err != nil {
log.Fatalf("Error cargando fivhero de configuración")
}
return os.Getenv(key)
}
func main() {
dotenv := goDotEnvVariable("DB_HOST")
fmt.Printf("%s = %s \n", "HOST", dotenv)
} Paquete viper
Viper es uno de los paquetes más populares en la comunidad golang y que no solo puede leer archivos .env. Procedemos de la siguiente manera:
Descargamos el paquete:
go get github.com/spf13/viper Ponemos el fichero de configuración y la ruta:
viper.SetConfigFile(".env") Leemos el fichero:
viper.ReadInConfig() Para obtener el valor de una clave:
viper.Get(key) Ejemplo de código para la función de lectura de una clave:
import (
"fmt"
"log"
"github.com/spf13/viper"
)
// retorna el valor de la clave solicitada
func viperEnvVariable(key string) string {
// SetConfigFile define explícitamente la ruta y el nombre del archivo.
// Viper utilizará esto y no comprobará ninguna de las rutas de
// configuración.
// .env: buscará el archivo .env en el directorio actual
viper.SetConfigFile(".env")
// Find and read the config file
err := viper.ReadInConfig()
if err != nil {
log.Fatalf("Error leyendo configuración, %s", err)
}
// viper.Get() devuelve una interfaz vacía{}
// para obtener el tipo subyacente de la clave, tenemos que hacer la
// aserción de tipo, sabemos que el valor subyacente es una cadena
// si escribimos la aserción a otro tipo, lanzará un error
value, ok := viper.Get(key).(string)
if !ok {
log.Fatalf("Tipo inválido")
}
return value
}