Переменные среды с Angular CLI
Настроить переменные окружения с помощью angular CLI довольно сложно. angular CLI упрощает работу со средами как для разработки, так и для производства. environment.*.ts
файлы отвечают за обработку сред в angular CLI.
Проблема возникнет с развертыванием приложения angular в Heroku, и пока мы включим конвейер для него, сценарий npm heroku-postbuild запускается, когда создается ярлык Heroku, когда вы «продвигаете» выпуски через свой Конвейер Heroku (например, от «разработки» к «промежуточному этапу» и «производству»), предварительно созданный ярлык Heroku продвигается «как есть» и НЕ перестраивается.
Consider a scenario:
То, что вы развертываете изменения в промежуточной стадии, но ваш package.json запускает «heroku-postbuild»: ng build --prod ' означает, что когда вы git нажимаете на свой « разработка », слизняк будет построен с опциями« prod ». Это нормально для «производственного» приложения. вместо этого будет использоваться `ng build --prod`, затем ` environment.prod.ts`.
environment.prod.ts
export const environment = { production: true, productionApiUrl: 'http://domain.com' }
angular.json
"environmentSource": "environments/environment.ts", "environments": { "dev": "environments/environment.ts", "prod": "environments/environment.prod.ts" }
Slug будет построен с использованием вышеупомянутого ‘productionApiUrl’, что означает, что при постановке он будет указывать на конечную точку производственного API.
Итак, здесь возникает вопрос: как мы можем изменить свойства в зависимости от среды (промежуточной и производственной) или переменных среды?
Ее можно решить с помощью dotenv, но, к сожалению, простая попытка запустить config
функцию dotenv, похоже, не работает с environment.*.ts
файлами - это, безусловно, самый прагматичный способ сделать это. Но когда я пытался это сделать, все просто всплывало undefined
Следующие шаги помогут использовать dotenv (process.env) с angular CLI.
npm install -g dotenv
- Добавьте
.env
с вашими чувствительными переменными среды согласно dotenv README - Добавьте сценарий (я назвал его
config-env.ts
, который динамически генерирует файл для вашей среды с использованием переменных среды (process.env) - Обновите
scripts
в своемpackage.json
, чтобы сначала запуститьconfig-env.ts
, а затем соответствующуюng build
команду
package.json
"config": "ts-node ./src/config-env.ts", "start": "npm run config -- && node server.js", "heroku-postbuild": "npm run config -- && ng build --prod"
config-env.ts
import { writeFile } from 'fs'; require('dotenv').config(); const environment = process.env.ENVIRONMENT; let apiURL; if (environment === 'production') { apiURL = process.env.PRODUCTION_API_ENDPOINT; } else if (environment === 'test') { apiURL = process.env.TEST_API_ENDPOINT; } const targetPath = `./src/environments/environment.prod.ts`; const envConfigFile = ` export const environment = { production: true, apiUrl: '${apiURL}'};` writeFile(targetPath, envConfigFile, function (err) { if (err) { console.log(err); }
.env
ENVIRONMENT= // define environment here PRODUCTION_API_ENDPOINT= // production api endpoint TEST_API_ENDPOINT= // staging api endpoint
Вышеупомянутый процесс сгенерирует файл environment.prod.ts
с разными конечными точками API на основе переменных среды, как и выше, будет легко использовать другие свойства с dotenv