Stiamo sviluppando un'applicazione 5 angolare che deve essere eseguita in diversi ambienti (dev, qa, int, uat, prod) e connettersi a API diverse a seconda dell'ambiente. Abbiamo tradizionalmente solo 4 ambienti e abbiamo un file di ambiente per ciascuno con le variabili di ambiente.
Ma ora con l'introduzione del 5 ° ambiente - integrazione (int) - Invece di aggiungere un canale di rilascio diverso in Octopus Deploy con una build diversa (che usa variabili d'ambiente), vogliono che l'app gestisca la configurazione rilevando il dominio nell'URL (in fase di esecuzione) e selezionare la configurazione in una struttura switch / case. per esempio:
let apiUrl = 'https://api.example.com/v2';
const location = window.location.origin;
switch(location){
case 'https:dev.hostname.domain':
apiUrl = 'https://dev-api.example.com/v2';
break;
case 'https:qa.hostname.domain':
apiUrl = 'https://qa-api.example.com/v2';
break;
case 'https:int.hostname.domain':
apiUrl = 'https://int-api.example.com/v2';
break;
case 'https:uat.hostname.domain':
apiUrl = 'https://uat-api.example.com/v2';
break;
}
Questo perché alcune persone stanno resistendo per modificare la configurazione dello strumento CI per aggiungere il nuovo canale di rilascio. Ma questo non mi sembra giusto, penso che le variabili di ambiente siano una soluzione migliore (viene utilizzato un file di ambiente diverso a seconda dell'obiettivo nella fase di compilazione). per esempio:
//QA environment file example
export const environment: Environment = {
production: 'false',
apiUrl = 'https://qa-api.example.com/v2',
otherEnvVar: 'whatever',
}
E poi importando l'ambiente dove necessario:
//Some app file
import {environment} from '../environments/environment';
// ... my code ...
Ma quando cerco di spiegare la ragione per cui non riesco a pensare a nient'altro che questa soluzione mi sembra "brutta" (che non è una valida ragione). Quindi ora mi chiedo se ci sia un motivo valido per separare le variabili di ambiente dalla logica dell'applicazione.
Quale sarebbe la soluzione migliore e perché? o entrambi sono ugualmente validi?