Git wird nicht nur gerne für Versionierung verwendet, sondern auch für das automatische Veröffentlichen neuer Updates. Die Zeiten, in denen man mit Kdiff verglichen und via FTP hochgeladen hat, sind vorbei. Doch sobald sensible Daten wie Passwörter oder API-Keys verwendet werden, fällt die Laune schnell in den Keller. Niemand hat Lust, seine privaten Daten zu versionieren. Die Folgen wären gerade bei Open-Source-Projekten fatal.
Die Lösung ist ganz einfach: eine Datei mit allen sensiblen Daten, welche jeder auf dem Rechner hat, aber gleichzeitig nicht versioniert wird. Das kann beispielsweise eine Datei in der Sprache deines Projekts sein, aber auch ein zentrales Dateiformat wie JSON. Letztendlich hat man sich jedoch auf den Standard der .env Dateien als einheitliches Format geeinigt.
Damit Git eine Datei oder ein Verzeichnis ignoriert, braucht es eine .gitignore Datei. Beachte, dass die Datei keine weitere Dateiendung wie .txt besitzt, da Git diese Datei sonst ignorieren wird. Sollte dir Windows das Erstellen dieser Datei verbieten, erstelle diese in einem Editor.
Nachdem du nun die Datei erstellt hast, kannst du pro Zeile eine Datei oder ein Verzeichnis hinzufügen, welches bei der Versionierung ignoriert werden soll. Das kann wie folgt aussehen:
/.env
/someFile.txt
/someDir/
Eine .env Datei ist zunächst eine normale Textdatei, welche mit jedem Editor geöffnet werden kann. Zuerst wird der Name einer Umgebungsvariable gesetzt, darauf folgt ein "ist gleich" Zeichen und anschließend, ohne Leerzeichen, der Wert der Variable. Der Wert kann aber kein beliebiger Wert, sondern muss ein String oder eine Zahl sein. Booleans können als Zahl mit 0 und 1 dargestellt werden und Arrays als JSON. Hier ein Beispiel aus einem aktuellen Projekt:
DEBUG=1
WEBMASTER_NAME="Tim Riedl"
WEBMASTER_MAIL="webmaster@timriedl.com"
MYSQL_HOST="localhost"
MYSQL_HOST_USER="NUTZERNAME"
MYSQL_HOST_PASS="PASSWORT"
MYSQL_HOST_TABL="TABELLE"
EMAIL_HOST="localhost"
EMAIL_PORT=12345
EMAIL_ADDR="MAIL@ADRESSE.DE"
EMAIL_NAME="ICH"
EMAIL_PASS="PASSWORT"
EMAIL_PROTOCOL="PROTOKOLL"
EMAIL_SMTP_AUTH=1
Da natürlich niemand riechen kann, was in einer .env Datei so alles stehen muss und schon gar nicht die Namen der Variablen weiß, werden Beispiel-Dateien mitgeliefert, also Dateien mit dem Aufbau der .env Datei, jedoch mit leeren Werten. Somit kann sich jeder diese Datei kopieren und sie wie eine Art Formular ausfüllen.
Da ich dir nun gezeigt habe, wie man diese Datei schreiben kann, möchte ich dir nun zeigen, wie du die Werte in deinem Projekt importieren kannst. Dazu habe ich mir die Programmiersprachen PHP, Python und NodeJS ausgesucht und die Vorgehensweisen an jeweils einem Beispiel beschrieben.
Da PHP keinen .env Parser integriert hat, nutze ich dazu ein Paket.
Für die Installation des Pakets verwende ich Composer. Solltest du nicht wissen, was Composer ist, dann schaue dir gerne den Artikel von Felix dazu an. Mit folgendem Paket installierst du das Paket:
composer require vlucas/phpdotenv
Um nun die Datei einzulesen und zu parsen, importiere den Composer Autoloader, erstelle eine Instanz von Dotenv mit dem Verzeichnis, in dem sich deine Datei befindet (in meinem Fall das aktuelle, also DIR) und rufe die Funktion load()
auf. Nun hast du alle Werte in der globalen $_ENV Variable zur Verfügung.
require_once __DIR__."/vendor/autoload.php";
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
echo "Der Webmaster heißt: ".$_ENV['WEBMASTER_NAME'];
In Python musst du ebenfalls ein Paket installieren. Dazu verwende ich den Paketmanager pip.
Installiert werden Python Pakete über den PIP Paketmanager.
pip install -U python-dotenv
In Python müssen die Pakete dotenv
und os
importiert werden um die Werte der .env Datei auslesen zu können.
from dotenv import load_dotenv
import os
load_dotenv()
print("Der Webmaster heißt: "+str(os.getenv("WEBMASTER_NAME")))
In NodeJS gibt es ebenfalls das Paket dotenv zum Parsen dieser Dateien. Der Installations-Befehl lautet:
npm i dotenv
Die Verwendung ist sehr einfach. Sobald das Modul installiert ist, muss es nur importiert und die Methode config
aufgerufen werden. Danach sind die Werte in der Variable proccess.env
vorhanden. So kannst du dann den Wert der Variable WEBMASTER_NAME
auslesen.
require('dotenv').config()
console.log(process.env.WEBMASTER_NAME)
Ich habe die .env Datei inzwischen in sämtlichen Projekten im Einsatz und finde den automatischen Workflow, gerade auch mit anderen Entwicklern, einfach gut. Alles läuft reibungslos ab und keiner veröffentlicht sensible Daten von sich auf GitHub.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Hey Philipp,
also technisch kannst du genauso gut JSON Dateien nehmen, ich denke aber so eine .env File ist einfach angenehmer zu editieren da nicht auf Klammern und Kommas geachtet werden müsste. Das ist aber eine Sache, wo vermutlich jeder seine Vorlieben hat. Ich sehe bei größeren Projekten zumindest fast nur .env, deswegen finde ich sollte man zumindest davon gehört haben. Ich würde dir da keinen Punktabzug im Codereview geben, ich bin mit beiden Methoden zufrieden :)
~ Tim
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
oder
key1="value1"
key2="value2"
key3="value3"
Hey Tim :)
Ich kann leider aus deinem Artikel nicht rauslesen, wieso .env Files jetzt sicherer sind als wenn ich eine JSON Config File hätte.
Oder welche Vorteile mir das .env File bringt. Würde mich freuen, wenn mir dazu eine Antwort da lässt oder den Artikel erweiterst.
Liebe Grüße Philipp