Cómo administrar los archivos y objetivos de configuración del entorno
Cuando creaste una aplicación angular usando las herramientas Angular CLI o Nrwl Nx , siempre tienes una carpeta con archivos de configuración del entorno:
<APP_FOLDER>/src/environments/ └──environment.ts └──environment.prod.ts
Puede cambiar el nombre de environment.prod.ts a environment.production.ts, por ejemplo, también puede crear archivos de configuración adicionales como environment.qa.ts o environment.staging.ts .
<APP_FOLDER>/src/environments/ └──environment.ts └──environment.prod.ts └──environment.qa.ts └──environment.staging.ts
El archivo environment.ts se usa de manera predeterminada. Para usar los archivos restantes, debe abrir angular.json y configurar la sección fileReplacements en la configuración de compilación y agregar bloques a las configuraciones de servidor y e2e .
{ "architect":{ "build":{ "configurations":{ "production":{ "fileReplacements":[ { "replace":"<APP_FOLDER>/src/environments/environment.ts", "with":"<APP_FOLDER>/src/environments/environment.production.ts" } ] }, "staging":{ "fileReplacements":[ { "replace":"<APP_FOLDER>/src/environments/environment.ts", "with":"<APP_FOLDER>/src/environments/environment.staging.ts" } ] } } }, "serve":{ "configurations":{ "production":{ "browserTarget":"app-name:build:production" }, "staging":{ "browserTarget":"app-name:build:staging" } } }, "e2e":{ "configurations":{ "production":{ "browserTarget":"app-name:serve:production" }, "staging":{ "browserTarget":"app-name:serve:staging" } } } } }
Para compilar o ejecutar una aplicación con un entorno específico, use los comandos:
ng build --configuration=staging ng start --configuration=staging ng e2e --configuration=staging ng build --prod ng build --configuration=production
Crear una interfaz para archivos de entorno.
No use archivos de entorno directamente, solo a través de DI
El uso de variables globales e importaciones directas viola el enfoque OOP y complica la capacidad de prueba de sus clases. Por lo tanto, es mejor crear un servicio que pueda inyectarse en sus componentes y otros servicios. Aquí hay un ejemplo de dicho servicio con la capacidad de especificar un valor predeterminado.
export const ENVIRONMENT = new InjectionToken<{ [key: string]: any }>('environment'); @Injectable({ providedIn: 'root', }) export class EnvironmentService { private readonly environment: any;
Separe la configuración de su entorno y la lógica empresarial
La configuración del entorno incluye solo propiedades relacionadas con el entorno, por ejemplo apiUrl . Idealmente, la configuración del entorno debe constar de dos propiedades:
export const environment = { production: true, apiUrl: 'https://api.url', };
También en esta configuración, puede agregar una propiedad para habilitar debugMode: depuración en modo verdadero o puede agregar el nombre del servidor donde se ejecuta el entorno de aplicación Nombre : 'QA' , pero no olvide que esta es una práctica muy mala si su código sabe algo sobre el servidor en el que se está ejecutando .
Nunca almacene información confidencial o contraseñas en una configuración de entorno.
Otras configuraciones como maxItemsOnPage o galleryAnimationSpeed deben almacenarse en otro lugar y es aconsejable usar configuration.service.ts, que puede recibir configuraciones desde algún punto final o simplemente cargar config.json desde la carpeta de activos.
1. Enfoque asincrónico (usar cuando la configuración puede cambiar en tiempo de ejecución)
2. Enfoque sincrónico (se usa cuando la configuración casi nunca cambia)
Reemplazar variables de entorno durante la implementación o el tiempo de ejecución
Muchos equipos violan la regla "Compilar una vez, implementar muchos" al ensamblar la aplicación para cada entorno en lugar de simplemente cambiar la configuración en la compilación ya construida.
No cree conjuntos separados con diferentes configuraciones; en su lugar, use solo un conjunto de producción y sustituya los valores durante la implementación o durante la ejecución del código. Hay varias opciones para hacer esto:
Reemplace los valores con marcadores de posición en los archivos de entorno que se reemplazarán en el ensamblaje final durante la implementación
export const environment = { production: true, apiUrl: 'APPLICATION_API_URL', };
Durante la implementación, la cadena APPLICATION_API_URL debe reemplazarse con la dirección real del servidor api.
Use variables globales e inyecte archivos de configuración con volúmenes de docker
export const environment = { production: true, apiUrl: window.APPLICATION_API_URL, };
Gracias por su atención al artículo, me complacerá recibir críticas y comentarios constructivos.
También únete a nuestra comunidad en Medium , Telegram o Twitter .