Het .env-bestand slaat omgevingsvariabelen op in een eenvoudig sleutel-waarde-formaat en scheidt configuratie van de broncode van de applicatie. Volgens The Twelve-Factor App (2011) moet configuratie strikt van code worden gescheiden, en .env-bestanden zijn de standaard van deze aanpak geworden. .env File maakt het mogelijk om verschillende waarden van API-sleutels, server-URL's en compilatievlaggen in te vullen zonder het project opnieuw te compileren.
Belangrijkste punten
.env File is een configuratiebestand waarin omgevingsvariabelen worden opgeslagen in een eenvoudig tekstformaat KEY=VALUE. Elke regel bevat één variabele: de sleutelnaam en zijn waarde gescheiden door een gelijkteken.
.env-bestanden lossen een fundamenteel probleem van moderne ontwikkeling op: verschillende omgevingen (lokaal, test, productie) vereisen totaal verschillende instellingen. De URL van de API-server op de lokale machine is http://localhost:8080, op de productieserver — https://api.production.com. Als deze waarden rechtstreeks in de applicatiecode zijn ingebed, vereist elke compilatie voor een andere omgeving wijziging van de broncode.
De praktijk van het opslaan van configuratie buiten de hoofdcode van de applicatie werd gestandaardiseerd in het manifest The Twelve-Factor App (2011), dat omgevingsvariabelen aanwees als de enige juiste manier om een applicatie te configureren. Volgens het JetBrains Developer Ecosystem-onderzoek (2024) gebruikt meer dan 67% van de mobiele ontwikkelaars .env-bestanden in hun projecten.
Voor mobiele ontwikkeling biedt .env een extra voordeel: waarden worden ingevuld tijdens de compilatiefase via Gradle (Android) of xcconfig (iOS), waardoor afzonderlijke builds voor ontwikkeling, staging en productie kunnen worden gemaakt zonder de broncode te wijzigen.
.env is vooral nuttig bij teamwerk: elke ontwikkelaar maakt zijn eigen lokale .env met instellingen voor zijn omgeving (pad naar lokale database, debug-API-sleutels), en gemeenschappelijke instellingen worden vastgelegd in .env.example in de repository. Dit voorkomt de situatie waarin na een git pull de build van een ontwikkelaar breekt door een ontbrekende omgevingsvariabele waar hij niet van wist. Een nieuw teamlid kopieert eenvoudig .env.example naar .env en vult zijn lokale waarden in.
Het .env-formaat is uiterst eenvoudig: elke regel is één variabele in de vorm KEY=VALUE. Spaties rond het gelijkteken worden meestal genegeerd, maar worden in de meeste bibliotheken als onderdeel van de waarde beschouwd, dus het is beter ze te vermijden.
Opmerkingen beginnen met het #-teken — de hele regel erna wordt genegeerd. Lege regels worden ook overgeslagen. Als de waarde spaties bevat, wordt deze tussen dubbele of enkele aanhalingstekens geplaatst.
# Belangrijkste omgevingsinstellingen
APP_NAME=MyMobileApp
APP_ENV=development
# API-configuratie
API_BASE_URL=http://localhost:3000/api
API_TIMEOUT=30000
# Gevoelige gegevens
DB_PASSWORD=secret_password_123
JWT_SECRET=your_jwt_secret_key
Alle variabelen in .env zijn strings, maar laadbibliotheken kunnen ze naar het vereiste type converteren. Voor het escapen van speciale tekens worden backslashes en aanhalingstekens gebruikt. Als de waarde het #-teken als onderdeel van de tekst bevat, moet deze worden geëscaped als \#.
KEY=value of KEY="value with spaces"PORT=8080DEBUG=trueKEY=line1\
line2DB_URL=${DB_HOST}:${DB_PORT}Tijdens het laden van .env kunnen bibliotheken variabele-interpolatie uitvoeren — waarden van de ene sleutel binnen de andere invullen. Bijvoorbeeld, de variabele DATABASE_URL=postgres://${DB_USER}:${DB_PASS}@localhost/db zal DB_USER en DB_PASS uit hetzelfde bestand openen.
De manier om .env aan te sluiten hangt af van het platform. Android gebruikt Gradle-plugins, iOS — xcconfig-configuratiebestanden, en cross-platform oplossingen zoals Flutter — gespecialiseerde bibliotheken.
In Android wordt .env geladen via de gradle-dotenv-plugin. De plugin leest .env uit de hoofdmap van het project en voegt waarden toe aan BuildConfig, waarna ze beschikbaar zijn in Kotlin- of Java-code via gegenereerde velden.
// build.gradle.kts (app level)
plugins {
id("co.uzzu.dotenv") version "4.0.0"
}
android {
buildFeatures {
buildConfig = true
}
}
kotlin {
// Toegang in code: BuildConfig.API_BASE_URL
buildConfigField("String", "API_BASE_URL",
"\"" + dotenv.get("API_BASE_URL") + "\"")
}
In iOS worden omgevingsvariabelen meestal geconfigureerd via xcconfig-bestanden. Voor het laden van .env in Swift wordt de DotEnv-bibliotheek of het ingebouwde Info.plist-mechanisme met aangepaste sleutels gebruikt.
// .env laden in Swift-project
import DotEnv
struct AppConfig {
static func load() {
let env = DotEnv(Bundle.main)
env.load()
let apiURL = ProcessInfo.processInfo
.environment["API_BASE_URL"] ??
"https://default.api.com"
}
}
Voor Flutter bestaat het pakket flutter_dotenv dat variabelen uit .env laadt tijdens de initialisatie van de applicatie. Het .env-bestand wordt in de hoofdmap van het project geplaatst en variabelen worden beschikbaar via de klasse dotenv.
// pubspec.yaml
dependencies:
flutter_dotenv: ^5.1
// main.dart — laden bij opstarten
import 'package:flutter_dotenv/flutter_dotenv.dart';
void main() async {
await dotenv.load(fileName: '.env');
var apiUrl = dotenv.get('API_BASE_URL');
runApp(MyApp(baseUrl: apiUrl));
}
Alle drie benaderingen delen een gemeenschappelijk principe: .env wordt tijdens de compilatiefase of bij het starten van de applicatie geladen, waarden worden gecacht en gebruikt in code via gegenereerde constanten. Dit voorkomt dat gevoelige gegevens in de repository terechtkomen.
Voor React Native wordt het pakket react-native-config gebruikt, dat tijdens de compilatiefase automatisch de BuildConfig-klasse voor Android en constanten in Info.plist voor iOS genereert uit één .env-bestand in de hoofdmap van het project. Dit is vooral handig voor startups die Expo of bare workflow gebruiken: één .env op hoofdniveau is voldoende en alle platforms ontvangen dezelfde omgevingsvariabelen zonder configuratieduplicatie.
Ondanks alle voordelen is .env geen volwaardige oplossing voor het opslaan van geheimen in een productieomgeving. Het biedt een basisbeschermingsniveau, maar bij verkeerd gebruik kan het leiden tot lekkage van vertrouwelijke gegevens.
De belangrijkste regel — .env mag nooit in het versiebeheersysteem terechtkomen. Het bestand wordt direct na aanmaak aan .gitignore toegevoegd, en alleen het voorbeeldbestand .env.example met lege of fictieve waarden wordt in de repository gecommit.
# .env.example — gecommit in repository
APP_NAME=
APP_ENV=development
API_BASE_URL=http://localhost:3000
API_TIMEOUT=30000
# DB_PASSWORD — zelfs niet in voorbeeld vermelden!
# JWT_SECRET — zelfs niet in voorbeeld vermelden!
# .gitignore
# Dotenv-bestanden
.env
.env*.local
Voor productieprojecten wordt aangeraden professionele oplossingen voor geheimbeheer te gebruiken. .env in productie is alleen toegestaan als het bestand zich buiten de document-root van de server bevindt en strikte toegangsrechten heeft.
Volgens Snyk State of Open Source Security (2024) was lekkage van .env-bestanden via repositories de oorzaak van meer dan 12% van alle incidenten met blootstelling van API-sleutels bij ondervraagde bedrijven. Het gebruik van een aparte geheimenmanager kan dit risico tot nul terugbrengen.
Extra bescherming wordt bereikt door het implementeren van pre-commit hooks met tools zoals husky en lint-staged, die controleren of een ontwikkelaar per ongeluk .env aan een commit heeft toegevoegd. Tools zoals git-secrets (AWS) en talisman scannen elke commit op patronen van API-sleutels, tokens en wachtwoorden, en blokkeren de commit bij detectie. Voor CI-pijplijnen wordt aangeraden een detect-secrets-controle toe te voegen — een automatische scanner die geen .env-bestand in de repository laat komen, zelfs niet bij een ontwikkelaarsfout.
Veelgestelde vragen
Nee, .env mag niet in Git worden gecommit. Het bestand bevat gevoelige gegevens en moet worden toegevoegd aan .gitignore. In plaats daarvan wordt .env.example met een sjabloon van alle benodigde variabelen in de repository geplaatst.
.env — het echte bestand met productiewaarden dat nooit wordt gecommit. Het bestand .env.example bevat dezelfde sleutels, maar met lege of fictieve waarden — het wordt als voorbeeld voor nieuwe ontwikkelaars in de repository gecommit.
Ja, maar wordt niet aanbevolen zonder extra bescherming. Als .env op de productieserver wordt gebruikt, moet het bestand zich buiten de document-root van de webserver bevinden met toegangsrechten 600 (alleen eigenaar). Voor kritieke projecten hebben geheimenbeheerders de voorkeur.
Via de gradle-dotenv-plugin (co.uzzu.dotenv). De plugin leest .env uit de hoofdmap van het project en exporteert waarden naar BuildConfig. Variabelen worden beschikbaar in code als BuildConfig.VARIABLE_NAME tijdens de compilatiefase.
Ja, veel parsers ondersteunen interpolatie in het formaat ${VAR_NAME}. Bijvoorbeeld, URL=${HOST}:${PORT} vult de waarden van HOST en PORT uit hetzelfde bestand in. Deze functionaliteit hangt echter af van de specifieke laadbibliotheek.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook