Zum Inhalt

Umgebung

In Vapor gibt es mehrere Umgebungen mit denen wir Standardwerte individuell für die Umgebung vordefinieren können. Mit dem Wechsel der Umgebung ändert sich automatisch das Verhalten der Anwendung. Wir können aber auch Werte direkt aus dem aktuellen Prozess abrufen oder aus einer sogenannten Umgebungsdatei (*.env) laden.

Umgebung Kurzform Beschreibung
production prod Umgebung bei Veröffentlichung.
development (default) dev Umgebung für die Entwicklung.
testing test Umgebung zum Testen.
Vapor nutzt standardmäßig die Umgebung Development.

Eigenschaft

Wir können über die Eigenschaft Environment auf die laufenden Umgebung zugreifen oder zwischen den Umgebungen wechseln.

/// [configure.swift]

switch app.environment {
case .production:
    app.databases.use(....)
default:
    app.databases.use(...)
}

Wechsel

swift run App serve --env production

Umgebungsvariable

Prozess

- Abrufen

Die Klasse Environment bietet die Methode get(_: String) an um einen Wert abzurufen.

let foo = Environment.get("FOO")
print(foo) // String?

Zusätzlich können wir den Wert auch dynamisch über die Eigenschaft process abrufen.

let foo = Environment.process.FOO
print(foo) // String?

- Bestimmen

In Xcode können wir eine Prozessvariable über das Schema App festlegen.

Im Terminal gibt es hierzu den Befehl export:

export FOO=BAR
swift run App serve

Umgebungsdatei

Eine Umgebungsdatei besteht aus Schlüssel-Wert-Paare, welche entsprechend der Umgebung geladen werden. Auf dieser Weise müssen die Umgebungsvariablen nicht manuell angelegt werden. Vapor lädt die Datei beim Starten aus dem Arbeitsverzeichnis. Für den Fall, dass du Xcode verwendest, denke daran das Arbeitsverzeichnis im Schema App zu hinterlegen.

# Key=Value
FOO=BAR

Nach dem Starten können wir auf die angegeben Umgebungsvariablen zugreifen. Bestehende Umgebungsvariablen werden nicht durch Variablen aus der Umgebungsdatei überschrieben.

Neben der allgemeinen Umgebungsdatei .env, versucht Vapor zusätzlich die Umgebungsdatei für die aktuelle Umgebung zu laden. Wenn sich die Anwendung zum Beispiel in der Umgebung Entwicklung befindet, wird Vapor versuchen die Datei .env.development zu laden. Umgebungsvariablen aus der Umgebungsdatei .env.development werden von Vapor höher als die Variablen der allgemeinen Umgebungsdatei eingestuft.

Benutzerdefinierte Umgebungen

In Vapor können wir eigene Umgebungen anlegen. Hierzu müssen wir nur die Klasse Environment entsprechend erweitern:

extension Environment {
    static var staging: Environment {
        .custom(name: "staging")
    }
}

Die laufende Umgebung wird standardmäßig in der Datei entrypoint über die Methode detect() erkannt und gesetzt:

@main
enum Entrypoint {
    static func main() async throws {
        var env = try Environment.detect()
        try LoggingSystem.bootstrap(from: &env)

        let app = Application(env)
        defer { app.shutdown() }

        try await configure(app)
        try await app.runFromAsyncMainEntrypoint()
    }
}

Die Methode greift auf die Argumente der Befehlzeile zu und zieht sich den entsprechenden Wert für das Argument --env.

Wir können das Standardverhalten überschreiben, indem wir die Methode durch eine neue Umgebungsdefinition ersetzen:

let env = Environment(name: "testing", arguments: ["vapor"])

Das Array für die Argumente muss mindestens den Wert vapor beinhalten.