Dotenv - Unterstützung für dotenv in Perl
Veröffentlicht von Thomas Fahle am (Permalink)
Trennung von Konfiguration und Code - Twelve-Factor App
Die strikte Trennung der Konfiguration vom Code ist gängige Praxis in Softwareentwicklung und Continuous Delivery.
Viele Frameworks und Applikationen speichern ihre Konfiguration in .env-Dateien (dotenv) und lesen diese als Umgebungsvariablen ein. Diese Vorgehensweise entspricht der Twelve-Factor App Methodologie.
Das CPAN-Modul Dotenv - Support for dotenv in Perl von Philippe Bruhat (BooK) liest Schlüssel-Werte-Paare aus einer .env-Datei, setzt diese als Umgebungsvariablen im %ENV und erleichtert so die Entwicklung von Perl Apps nach der Twelve-Factor App Methodologie.
Aufbau der dotenv-Dateien
Das env-Datenformat ist ein zeilenbasiertes Format, das aus Zeilen von KEY=VALUE Paaren besteht.
KEY=VALUE
Leerzeilen werden übersprungen, Kommentare starten mit dem #-Zeichen und gehen bis zum Ende einer Zeile.
# Comment KEY=VALUE # Comment
Das Format ist einigermaßen kompatibel mit der Shell (so dass es mit einem Minimum an Aufwand möglich ist, die Umgebungsvariablen mit Hilfe der . oder Source-Shell-Builtins zu lesen).
export KEY=VALUE # Comment
Variablen werden aktuell von Dotenv nicht expandiert. Etwas wie
# Development settings DOMAIN=example.org ADMIN_EMAIL=admin@${DOMAIN} ROOT_URL=${DOMAIN}/app
funktioniert daher leider nicht.
Beispiel
Dieses einfache Beispiel lädt folgende .env-Datei (Default) im aktuellen Verzeichnis,
#KEY=VALUE APP_STAGE="development" APP_SSH_OPTS=" -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" APP_SSH_KEY_FILE="./id_rsa" APP_DB_HOST='db.dev.example.com' APP_LOG_LEVEL=TRACE export FOO=BAR
fügt die dort gefundenen Schlüssel und Werte in den %ENV ein
#!/usr/bin/env perl use strict; use warnings; use feature 'say'; use Dotenv; # exports nothing Dotenv->load; # merge the content of .env in %ENV my @config_vars = qw/ APP_STAGE APP_SSH_OPTS APP_SSH_KEY_FILE APP_DB_HOST APP_LOG_LEVEL FOO /; foreach my $config_var ( sort @config_vars ) { say "$config_var = $ENV{$config_var}"; }
und gibt die Schlüssel und Werte aus.
APP_DB_HOST = db.dev.example.com APP_LOG_LEVEL = TRACE APP_SSH_KEY_FILE = ./id_rsa APP_SSH_OPTS = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no APP_STAGE = development FOO = BAR
Über den Parameter -load kann auch ein Dateiname angegeben werden.
#!/usr/bin/env perl use strict; use warnings; use feature 'say'; use Dotenv -load => 'myenv'; # merge the content of myenv in %ENV my @config_vars = qw/ APP_STAGE APP_SSH_OPTS APP_SSH_KEY_FILE APP_DB_HOST APP_LOG_LEVEL FOO /; foreach my $config_var ( sort @config_vars ) { say "$config_var = $ENV{$config_var}"; }
Dotenv kann Variablen nicht nur aus Dateien lesen, sondern auch aus weiteren Quellen. Details finden sich in der Dokumentation.
Schutz vor Überschreiben der Umgebungsvariablen
Dotenv fasst bereits gesetzte Umgebungsvariablen nicht an.
Bei bereits gesetzter Umgebungsvariable FOO liefert das obige Beispiel
FOO=EXTERNAL_BAR ./dotenv.pl
jetzt folgende Ausgabe:
APP_DB_HOST = db.dev.example.com APP_LOG_LEVEL = TRACE APP_SSH_KEY_FILE = ./id_rsa APP_SSH_OPTS = -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no APP_STAGE = development FOO = EXTERNAL_BAR
Auch bei mehreren Inputs wird dieses Prinzip beibehalten.
Siehe auch
- Dotenv - Support for dotenv in Perl
- .env - the dot env application configuration file
- .env loading the dot env file?
- Import environmental value from .env(dotenv) and print specified ENV value
- Twelve-Factor App
- Twelve-Factor App - III. Konfiguration
- An illustrated guide to 12 Factor Apps
- Shell::EnvImporter - Perl extension for importing environment variable changes from external commands or shell scripts als Alternative
Source-Code der Beispiele im Github Repo perl-howto-code.
Bildnachweis
Photo by Matt Artz on Unsplash