Saltar a contenido

Entorno

La API de entorno (Environment) de Vapor te ayuda a configurar tu app de manera dinámica. Por defecto, tu app usará el entorno development. Puedes definir otros entornos útiles como production o staging y cambiar la configuración de la app para cada caso. También puedes cargar variables desde el entorno del proceso o desde ficheros .env (dotenv) dependiendo de tus necesidades.

Para acceder al entorno actual, usa app.environment. Puedes hacer un switch de esta propiedad en configure(_:) para ejecutar distintas lógicas de configuración.

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

Cambiando de Entorno

Por defecto, tu app se ejecutará en el entorno development. Puedes cambiar esto pasando el argumento (flag) --env (-e) durante el arranque de la app.

swift run App serve --env production

Vapor incluye los siguientes entornos:

nombre abreviación descripción
production prod Distribuido a tus usuarios.
development dev Desarrollo local.
testing test Para test unitario (unit testing).

Información

El entorno production usará el nivel de registro notice por defecto si no se especifica otro. El resto de entornos usarán info por defecto.

Puedes pasar tanto el nombre entero como la abreviación del nombre en el argumento --env (-e).

swift run App serve -e prod

Variables de Proceso

Environment ofrece una API simple basada en cadenas (string) para acceder a las variables de entorno de los procesos.

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

Además del método get, Environment ofrece una API de búsqueda dinámica de miembros (dynamic member lookup) mediante process.

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

Al ejecutar tu app en el terminal, puedes estableces variables de entorno usando export.

export FOO=BAR
swift run App serve

Al ejecutar tu app en Xcode, puedes estableces variables de entorno editando el esquema (scheme) de la App.

.env (dotenv)

Los fichero dotenv contienen una lista de pares clave-valor para ser cargados automáticamente en el entorno. Estos ficheros facilitan la configuración de variables de entorno sin necesidad de establecerlas manualmente.

Vapor buscará ficheros dotenv en el directorio de trabajo actual (current working directory). Si estás usando Xcode, asegúrate de configurar el directorio de trabajo (working directory) editando el esquema (scheme) de la App.

Asume que el siguiente fichero .env está en la carpeta raíz de tu projecto:

FOO=BAR

Cuando tu aplicación arranque, podrás acceder a los contenidos de este fichero como si fueran otras variables de entorno de proceso.

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

Información

Las variables especificadas en ficheros .env no sobrescribirán variables ya existentes en el entorno de proceso.

Junto con .env, Vapor también tratará de cargar un fichero dotenv para el entorno actual. Por ejemplo, en el entorno development, Vapor cargará .env.development. Cualquier valor en el fichero de entorno especificado tendrá prioridad frente al fichero .env general.

Un típico patrón a seguir en los proyectos es incluir un fichero .env como una plantilla con valores predeterminados. Los ficheros de entorno específico pueden ser ignorados con este patrón de .gitignore:

.env.*

Cuando el proyecto es clonado a otra computadora, el fichero .env de plantilla puede ser copiado, para después insertar los valores correctos.

cp .env .env.development
vim .env.development

Aviso

Los ficheros dotenv con información sensible como contraseñas no deben añadirse en los commits del control de versiones.

Si estás teniendo dificultades en la carga de ficheros dotenv, prueba a habilitar el registro de depuración (debug logging) con --log debug para obtener más información.

Entornos Personalizados

Para definir un nombre de entorno personalizado, realiza una extensión de Environment.

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

El entorno de la aplicación es establecido normalmente en entrypoint.swift usando Environment.detect().

@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()
    }
}

El método detect usa los argumentos de línea de comandos del proceso y analiza el argumento (flag) --env automáticamente. Puedes sobrescribir este comportamiento inicializando un struct Environment personalizado.

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

El array de argumentos debe contener al menos uno que represente el nombre del ejecutable. Se pueden suministrar más argumentos para simular el paso de argumentos mediante línea de comandos. Esto es especialmente útil para testing.