Angular 2+中的环境特定文件

时间:2018-02-13 05:55:37

标签: angular

我们在enter image description here

中的应用程序中有一个文件

此文件包含在整个应用程序中使用的所有常量服务URL。 现在我的问题是当我们的环境从开发变为QA或生产时,我们需要更改此文件。

我们有没有办法在角度2+处理这个?通过为特定环境创建单独的常量文件?

2 个答案:

答案 0 :(得分:0)

如果您使用的是角度CLI,那么您将拥有两个文件environment.ts和environment.prod.ts。您可以使用这些文件来存储常量。 在正常构建环境中使用.ts。但是当您使用

创建构建时
ng build --prod
在这种情况下将使用

environment.prod.ts

enter image description here

答案 1 :(得分:0)

对于配置文件,我很久以前就找到了一个教程(但是使用" .json"文件)

import { Inject, Injectable } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs/Rx';


@Injectable()
export class ArchConfigurationService {
    private config: Object = null;
    private env:    Object = null;

  constructor (
    private http: Http,
  ) { }

    /**
    * Permite recuperar una propiedad en concreto.
    * Normalmente será una string, pero tambien puede ser un objeto
    * @param key La propiedad a buscar en la configuración.
    */
    public getProperty(key: string): any {
        return this.config[key];
    }

    /**
     * Obtain the env.
     */
    public getEnv(): string {
        return this.env['env'];
    }

    /**
     * Loads the "env.json" to obtain the env (Ej: 'production', 'development' )
     *  Then for this env loads the "[env].config.json"  (Ej: 'development.config.json')
     */
    public load() {
        return new Promise((resolve, reject) => {
            this.http.get('./enviroments/env.json')
            .map( res => res.json() )
            .catch((error: any):any => {
                console.log('Configuration file "env.json" could not be read');
                resolve(true);
                return Observable.throw(error || 'Server error');
            }).subscribe( (envResponse) => {
                this.env = envResponse;
                let request:any = null;
                let enviro = this.getEnv();
                switch (enviro) {
                    case 'production': 
                        request = this.http.get('/enviroments/' + enviro + '.config.json');
                    break;

                    case 'development': 
                        request = this.http.get('./enviroments/' + enviro + '.config.json');
                    break;

                    default: 
                        console.error('Environment file is not set or invalid');
                        resolve(true);
                    break;
                }
                if (request) {
                    request
                        .map( (res: any) => res.json() )
                        .catch((error: any) => {
                            console.error('Error reading ' + enviro + ' configuration file');
                            resolve(error);
                            return Observable.throw(error || 'Server error');
                        })
                        .subscribe((responseData: any) => {
                            this.config = responseData;
                            resolve(true);
                        });
                } else {
                    console.error('Env config file "env.json" is not valid');
                    resolve(true);
                }
            });

        });
    }
  }

env.json

{
  "env": "development"
}

和development.config.json

{
   "url": ...
}

如果你想在app加载中使用(否则使用" load")

import { ArchConfigurationService } from './services/arch.configuration.service';

providers: [
    ArchConfigurationService,
    { provide: APP_INITIALIZER, useFactory: (config: ArchConfigurationService) => () => config.load(), deps: [ArchConfigurationService], multi: true },
 ...