Передача переменных среды в npm-скриптах
У меня есть package.json со следующим (упрощенным) контентом в ключе скриптов:
...
scripts: {
"start": "NODE_ENV=${NODE_ENV:=production} node start-app.js",
"poststart": "echo $NODE_ENV"
}
...
В командной строке я могу запустить:
npm start
Это запустит мой start-app.js script и установите переменную среды process.env.NODE_ENV в "production". См. здесь для объяснения синтаксиса.
Poststart автоматически запускается после запуска, как описано здесь.
Однако poststart не будет "наследовать" переменную среды оболочки NODE_ENV, поэтому команда echo не будет отгонять ничего.
Мой код обработки немного сложнее, но я пытаюсь выполнить передачу переменной NODE_ENV с "начальной точки" на зависимые скрипты. Любые предложения/рекомендации по тому, как это сделать?
Я не хочу жестко кодировать NODE_ENV в poststart, потому что я могу захотеть сделать:
NODE_ENV=development npm start
и я хочу, чтобы все "вниз по цепочке" наследовали одну и ту же среду.
Ответы
Ответ 1
У вас есть несколько вариантов:
- better-npm-run, который может определять
env
для каждой команды отдельно
- Вместо
poststart
script вы можете конкатенировать команды для npm следующим образом: "start": "NODE_ENV=${NODE_ENV:=production} node start-app.js && echo $NODE_ENV"
- Используйте диспетчер процессов в процессе производства, например pm2. pm2 позволяет вам определять json файлы, специфичные для среды, с такими настройками, как
NODE_ENV
. В нашей компании мы успешно запускаем все наши приложения в разных средах с pm2 (все время с той же командой запуска)
Ответ 2
вот как я это сделал, сначала нужно установить две dev-зависимости
https://www.npmjs.com/package/env-cmd это загрузит ваш env var из вашего файла
https://www.npmjs.com/package/cross-env эта переменная окружения использования в скрипте
пример скриптов:
"env-cmd ./.config/prod.env cross-env-shell \"docker volume create $DOCKER_VOLUME\""
эта загрузка $ DOCKER_VOLUME env var из prod.env
Ответ 3
Если у вас небольшое использование, используйте best-npm-run. Для небольших случаев он работает нормально. Так или иначе, если у вас много команд, и это сложно справиться. Попробуйте batman-cli. Хорошо работать и обрабатывать множество проблем, связанных с окружающей средой.
npm я -g batman-cli