Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61

Deprecated: substr(): Passing null to parameter #1 ($string) of type string is deprecated in /srv/vhost/diaridigital.net/home/html/sourcecode/includes/config.php on line 61
Gestionar variables de entorno
Source Code

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
}
Referencias
Xavier es un desarrollador senior full stack y opera desde la ciudad mediterránea de Barcelona. Le encantan las tecnologías de software y está convencido que el desarrollo de software es un proceso colaborativo y abierto.
Y es un apasionado de la astronomía y de la fotografía. Lo puedes encontrar en:
Comparte este post