Передача переменных среды в 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