Здравствуйте, добро пожаловать в еще одну статью о том, как управлять несколькими средами, на этот раз в Angular. Это очень распространенное требование в любом приложении, поскольку приложение обычно имеет несколько сред, таких как DEV, QA, Staging & Production.

Файлы, которые нужно будет изменить в нашем

  • package.json
  • angular.json
  • environment.ts

Нам также нужно добавить несколько дополнительных файлов для управления несколькими средами (предполагая, что мы настраиваем для двух сред, я создал два файла)

  • environment.dev.ts
  • environment.qa.ts
  1. Изменения в package.json

Нам нужно добавить команды в наш раздел сценария, как выделено, чтобы мы могли начать поддерживать такие команды, как npm run build: {environment_name}

"scripts": { 
"ng": "ng",
"start": "ng serve",
"build:dev": "ng build --configuration=dev",
"build:qa": "ng build --configuration=qa"
},

2. Изменения в angular.json

Нам нужно добавить две конфигурации (dev и QA), чтобы можно было выполнять команды, упомянутые в package.json.

Выделены основные конфигурации, но нас интересует окружающая среда. fileReplacements помогает нам управлять файлами в соответствии с нашими конфигурациями.
Здесь, если мы выполним команду npm run build: dev, то файл environment.ts будет заменить на environment.dev.ts, соответственно, будет сгенерирован вывод сборки.

"configurations": {
            "dev": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.dev.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": true,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "20mb",
                  "maximumError": "30mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb"
                }
               ]
            },
            "qa": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.qa.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "budgets": [
                {
                  "type": "initial",
                  "maximumWarning": "20mb",
                  "maximumError": "30mb"
                },
                {
                  "type": "anyComponentStyle",
                  "maximumWarning": "6kb"
                }
              ]
            }
          }
        }
}

3. Изменения или дополнения в файле Среда.

Я добавил несколько свойств (API_IP), чтобы показать вам разницу, вы можете добавить соответствующие переменные среды. Все эти файлы в соответствии с моей конфигурацией находятся в папке сред.

Environment.ts

export const environment = {
  API_IP: 'http://localhost',
  API_PORT: ':5050/',
  Version: 'localhost',
  APP_PORT : '4200/',
  WS_PROTOCOL: 'ws://'
};

Environment.dev.ts

export const environment = {
  API_IP: 'http://dev.mycompany.com',
  API_PORT: ':5001/',
  Version: 'v 10.1203010.23',
  APP_PORT : '4200/',
  WS_PROTOCOL: 'ws://'
};

Environment.qa.ts

export const environment = {
  API_IP: 'https://qa.mycompany.com',
  API_PORT: ':5010/',
  Version: 'v 20.11122020.23',
  APP_PORT : '4201/',
  WS_PROTOCOL: 'ws://'
};

4. Метод USAGE: getProducts, который будет вести себя по-разному в зависимости от сборки.

Файл: app.constants.ts

import { environment } from './../environments/environment';
export const API_IP = environment.API_IP;
export const API_PORT = environment.API_PORT;
export const API_URL = API_IP + API_PORT;
export const NoAccess = "This is not environment specific variable";

Окончательный: product.service.ts

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { API_URL } from "app/app.constants";
import { Observable } from "rxjs";
@Injectable()
export class ProductService {
   constructor(private _http: HttpClient) { }
   public getProducts() {
      return this._http.get(`${API_URL}Products`);
   }
}

Вы дошли до конца статьи. Если вы считаете, что это было полезно, оставьте комментарий.