Допустим, у нас есть файл .env, в котором указаны некоторые переменные:
AWS_PROFILE=hsz
ENVIRONMENT=development
Также определена простая задача npm:
{
"name": "project",
"version": "0.0.1",
"scripts": {
"deploy": "sls deploy"
}
}
Но запуск npm run deploy игнорирует наше определение .env.
Это можно решить с помощью better-npm-run, например:
{
"name": "project",
"version": "0.0.2",
"scripts": {
"deploy": "bnr deploy"
},
"betterScripts": {
"deploy": "sls deploy"
},
"devDependencies": {
"better-npm-run": "^0.1.1",
}
}
но это похоже на накладные расходы - особенно когда у нас 10+ задач.
Есть ли лучший способ всегда загружать .env, не проксируя все задачи через better-npm-run?





Сохраняйте и загружайте всю конфигурацию вашей среды в самом проекте.
dev.js
module.exports = {
"host":"dev.com"
}
prod.js
module.exports = {
"host":"prod.com"
}
config.js - основной файл, который разрешит конфигурацию на основе переменной process.env.ENV.
const dev = require('./dev');
const prod = require('./prod');
let envObject = {};
const env = process.env.ENV || "dev";
switch(env) {
case 'prod':
envObject = prod;
break;
default:
envObject = dev;
}
envObject['ENV'] = env;
process.env = Object.assign(process.env,envObject); // Optional if you prefer to add them into process environment otherwise `require('./config')` where you need configuration.
module.exports = envObject;
index.js - вызов корневого файла проекта узла каждый раз при запуске проекта
const config = require('./config');
console.info('config object => ',config.host);
package.json
{
"name": "project",
"version": "0.0.2",
"scripts": {
"deploy": "sls deploy"
}
}
Запуск кода node.js
Прод-окружение ENV=prod npm run deploy;
Среда разработки - npm run deploy;
Среда по умолчанию установлена на dev в ./config.js
Используя эту простую практику, вам не понадобится какой-либо модуль npm для управления конфигурациями вашей среды.
Или создайте файл .npmrc внутри корневой папки проекта и установите там переменную. docs.npmjs.com/files/npmrc#files
Немного некрасиво, но вы можете попробовать что-то вроде этого:
"scripts": {
"deploy": "export $(cat .env | xargs) && sls deploy"
}
Это экспортирует все переменные среды из файла .env перед запуском sls deploy.
Есть несколько вариаций этой техники в этот ответ.
Не очень чисто, но позволяет избежать использования дополнительного модуля.
Вы можете использовать пакет npm env-cmd для установки переменных среды, загружаемых из файла .env перед выполнением сценария npm.
npm i env-cmd -D
{
"scripts": {
"deploy": "env-cmd sls deploy"
}
}
Спасибо, но суть в том, чтобы не ставить перед
npm runкакие-либо переменные env; также в случае запускаsls deploy- внешнего инструмента -index.jsне загружается вообще.