The Portuguese translation for this article is provided by App Dev Manager Julio Madeira. English version available here.
O Angular-CLI é a maneira recomendada de criar um aplicativo pronto para produção, completo com agrupamento, atualização e testes. Um Aplicativo desenvolvido com o Angular-CLI vem com um mecanismo para criar versões especificas para cada ambiente, contudo, esses arquivos de configurações vem em formato TypeScript e não permitem que sejam editados pela equipe de TI ou por processos automatizados de Deployment, como por exemplo o VSTS.
Esse Post vai explicar em alguns passos e exemplos como usar um arquivos JSON de configuração que pode ser customizado para múltiplos ambientes.
Defina a Interface TypeScript para configuração:
O uso de interfaces numa App Angular, provê uma serie de funcionalidades (intellisense) e seguras (type-safety) para as entidades que você estiver usando. No exemplo abaixo, vamos usar um arquivo-exemplo como “Arquivo de Configuração”:
app-config.model.ts
export interface IAppConfig {
env: {
name: string;
};
appInsights: {
instrumentationKey: string;
};
logging: {
console: boolean;
appInsights: boolean;
};
aad: {
requireAuth: boolean;
tenant: string;
clientId: string;
};
apiServer: {
metadata: string;
rules: string;
};
}
Crie um arquivo de configuração JSON fils
A convenient place to store configuration files is under the assets folder of your project. Using the interface defined above, sample files could look as follows:
Um local conveniente para armazenar arquivos de configuração está na pasta “Assets” do seu projeto. Usando a interface definida acima, os arquivos de exemplos podem ter a seguinte aparência:
assets\config\config.dev.json
{
"env": {
"name": "DEV"
},
"appInsights": {
"instrumentationKey": "<dev-guid-here>"
},
"logging": {
"console": true,
"appInsights": false
},
"aad": {
"requireAuth": true,
"tenant": "<dev-guid-here>",
"clientId": "<dev-guid-here>"
},
"apiServer": {
"metadata": "https://metadata.demo.com/api/v1.0/",
"rules": "https://rules.demo.com/api/v1.0/"
}
}
assets\config\config.deploy.json (Observe os espaços reservados que são substituídos durante a implantação)
{
"env": {
"name": "#{envName}"
},
"appInsights": {
"instrumentationKey": "#{appInsightsKey}"
},
"logging": {
"console": true,
"appInsights": true
},
"aad": {
"requireAuth": true,
"tenant": "#{aadTenant}",
"clientId": "#{aadClientId}"
},
"apiServer": {
"metadata": "https://#{apiServerPrefix}.demo.com/api/v1.0/",
"rule": "https://#{apiServerPrefix}.demo.com/api/v1.0/",
}
}
Continue a usar o “environment.ts“ com o build do Angular-CLI
A Angular-CLI cria vários arquivos de ambiente TypeScript na pasta de ambientes. Eles ainda serão usados, mas contêm apenas o nome do ambiente.
environments\environment.dev.json
export const environment = {
name: 'dev'
};
environments\environment.deploy.json
export const environment = {
name: 'deploy'
};
angular.json
"projects": {
"my-app": {
"architect": {
"build": {
"configurations": {
"deploy": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.deploy.ts"
}
],
. . .
}
}
},
"serve": {
. . .
"configurations": {
"deploy": {
"browserTarget": "my-app:build:deploy"
}
Crie um serviço para ler o arquivo de Config
Este serviço lerá o arquivo de configuração correto e armazenará o resultado em um campo estático nesta classe.
app.config.ts (Observe o uso da interface definida acima e a convenção de nomenclatura do arquivo de configuração para recuperar o arquivo correto.)
import { Injectable } from '@angular/core’;
import { HttpClient } from '@angular/common/http';
import { environment } from '../environments/environment';
import { IAppConfig } from './models/app-config.model';
@Injectable()
export class AppConfig {
static settings: IAppConfig;
constructor(private http: HttpClient) {}
load() {
const jsonFile = `assets/config/config.${environment.name}.json`;
return new Promise<void>((resolve, reject) => {
this.http.get(jsonFile).toPromise().then((response : IAppConfig) => {
AppConfig.settings = <IAppConfig>response;
resolve();
}).catch((response: any) => {
reject(`Could not load file '${jsonFile}': ${JSON.stringify(response)}`);
});
});
}
}
Carregue o arquivo de Config antes de criar a Aplicação
Angular inclui um token chamado APP_INITIALIZER que permite ao nosso aplicativo executar código quando o aplicativo é inicializado. No módulo do aplicativo, use esse token para chamar o método load em nosso serviço de configuração. Como nosso método retorna uma promessa/promissoe, o Angular atrasará a inicialização até que a promessa/promisse seja resolvida.
app.module.ts
import { APP_INITIALIZER } from '@angular/core';
import { AppConfig } from './app.config';
export function initializeApp(appConfig: AppConfig) {
return () => appConfig.load();
}
@NgModule({
imports: [ , , , ],
declarations: [ . . . ],
providers: [
AppConfig,
{ provide: APP_INITIALIZER,
useFactory: initializeApp,
deps: [AppConfig], multi: true }
],
bootstrap: [
AppComponent
]
})
export class AppModule { }
Consuma as configurações da App através de toda a aplicação
As configurações agora estão disponíveis em qualquer lugar do aplicativo e incluem a verificação de tipo fornecida pela interface.
export class DataService {
protected apiServer = AppConfig.settings.apiServer;
. . .
if (AppConfig.settings.aad.requireAuth) { . . . }
}
export class LoggingService {
. . .
instrumentationKey: AppConfig.settings && AppConfig.settings.appInsights ?
AppConfig.settings.appInsights.instrumentationKey : ''
. . .
if (AppConfig.settings && AppConfig.settings.logging) { . . . }
}
Nota: para criar uma versão de produção do aplicativo usando um nome de ambiente diferente de prod, use este comando:
ng build –configuration=deploy
0 comments