Dotenv - Unterstützung für dotenv in Perl

Veröffentlicht von Thomas Fahle am (Permalink)

Two silver open wrenches on a black background

 

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

 

Source-Code der Beispiele im Github Repo perl-howto-code.

 

Bildnachweis

Photo by Matt Artz on Unsplash