Перекрестное сообщение от https://blog.f5.works/managing-environment-variables-in-ionic-2-3/
Эта проблема
При разработке приложений Ionic 2 очень часто разработчики хотят хранить разные значения конфигурации приложения в разных средах. Например, URL-адреса API серверной части в разработке и производстве различаются. Или два разных ключа Google Map Api используются в среде контроля качества и в производственной среде.
Наш подход в F5 Works
- Хранение пар KEY = VALUE в одном файле .env, которые соответствуют методологии Двенадцатифакторное приложение.
- Внедрить содержимое .env в глобальную переменную ENV в процессе сборки Ionic (мы используем Webpack, но аналогичный подход может применяться к другим сборщикам, таким как RollupJS)
- Создайте инъекционный класс AppConfig, к которому можно будет получить доступ в приложении и который можно легко смоделировать для простоты тестирования.
Рецепт
Шаг 1. Создайте .env в корне проекта (хранилище KEY = VALUE)
API_URL=http://localhost:3000/api/v1
GOOGLE_MAP_API_KEY=XxxYyyZzz
ПРИМЕЧАНИЕ: вам следует git игнорировать файл .env
Шаг 2. Добавьте содержимое .env в глобальную переменную ENV
- создайте config / webpack.config.js с содержимым ниже
var dotenvConfig = require('dotenv').config(); var _ = require('lodash'); var path = require('path'); var webpack = require('webpack'); var ionicWebpackFactory = require(process.env.IONIC_WEBPACK_FACTORY);
function getPlugins() { var plugins = [ new webpack.DefinePlugin({ 'process.env': _(process.env) .pick(_.keys(dotenvConfig)) .mapValues((v) => (JSON.stringify(v))) .value() }) ]; // for dev builds, use our custom environment return [ ...plugins, ionicWebpackFactory.getIonicEnvironmentPlugin() ]; }
module.exports = { entry: process.env.IONIC_APP_ENTRY_POINT, output: { path: '{{BUILD}}', publicPath: 'build/', filename: process.env.IONIC_OUTPUT_JS_FILE_NAME, devtoolModuleFilenameTemplate: ionicWebpackFactory.getSourceMapperFunction(), }, devtool: process.env.IONIC_SOURCE_MAP_TYPE,
resolve: { extensions: ['.ts', '.js', '.json'], modules: [path.resolve('node_modules')] },
module: { loaders: [ { test: /\.json$/, loader: 'json-loader' }, { test: /\.ts$/, loader: process.env.IONIC_WEBPACK_LOADER } ] },
plugins: getPlugins(),
// Some libraries import Node modules but don't use them in the browser. // Tell Webpack to provide empty mocks for them so importing them works. node: { fs: 'empty', net: 'empty', tls: 'empty' } };
ПРИМЕЧАНИЕ: исходную конфигурацию веб-пакета можно найти в node_modules / @ ionic / app-scripts
- добавьте ниже в package.json, чтобы процесс сборки Ionic знал об этом:
"config": {
"ionic_webpack": "./config/webpack.config.js"
}
- установите модуль npm dotenv и lodash:
npm install dotenv --save-dev
npm install lodash --save-dev
Шаг 3. Создайте и внедрите класс AppConfig
- создать src / config / app.config.ts:
import { Injectable } from '@angular/core';
declare var process: any;
@Injectable() export class AppConfig { public apiBaseUrl: string; public googleMapApiKey: string;
constructor() { this.apiBaseUrl = this._readString('API_URL', 'http://localhost:3000/api/v1'); this.googleMapApiKey = this._readString('GOOGLE_MAP_API_KEY', 'xxxyyy111');
console.debug('AppConfig', this); }
private _readString(key: string, defaultValue?: string): string { const v = process.env[key]; return v === undefined ? defaultValue : String(v); } }
- вставить AppConfig в src / config / app.module.ts:
import { NgModule } from '@angular/core'; import { AppConfig } from '../config/app.config';
@NgModule({ providers: [ AppConfig,
// other injectables ] }) export class AppModule {}
Шаг 4. Считывание значений в AppConfig из других компонентов
- теперь значения AppConfig доступны во всех компонентах, например src / app / app.component.ts:
import { Component, ViewChild } from '@angular/core'; import { AppConfig } from '../config/app.config';
@Component({ templateUrl: 'app.html' }) export class MyApp { constructor(public appConfig: AppConfig) { console.debug('AppConfig', this.appConfig); } }
- запускать приложение Ionic и просматривать результат в действии из инспектора Chrome
.env для другой среды
Теперь вы можете ввести различные заданные значения в .env с компьютера, на котором создается или запускается приложение Ionic. Например, наш агент CI в Jenkins имеет другой набор значений .env для создания приложений в разных средах.
Альтернатива
Вместо одного .env мы могли бы иметь файлы json для каждой среды.
config/developement.json
config/production.json
Мы использовали этот подход в наших проектах Ionic1. Однако, когда проект растет, он становится немного беспорядочным, поскольку, как правило, создается больше личных конфигурационных json-файлов. Поэтому мы решили поэкспериментировать с подходом с единым окружением, который предлагает Двенадцатифакторное приложение:
Другой аспект управления конфигурацией - это группировка. Иногда приложения группируют конфигурацию в именованные группы (часто называемые «средами»), названные в честь конкретных развертываний, таких как среды
development
,test
иproduction
в Rails. Этот метод не масштабируется чисто: по мере создания новых развертываний приложения необходимы новые имена среды, напримерstaging
илиqa
. По мере дальнейшего развития проекта разработчики могут добавлять свои собственные специальные среды, такие какjoes-staging
, что приводит к комбинаторному взрыву конфигурации, что делает управление развертыванием приложения очень хрупким.
ОБНОВЛЕНИЕ 2018-08-31
Ionic 3 теперь поставляется с поддержкой управления переменными среды. Подробнее см. Здесь https://github.com/ionic-team/ionic-app-scripts#environments.