Как задать переменные окружения из файла package.json?
Как установить переменные окружения из файла package.json
для использования с командами типа npm start
?
У меня есть следующий код в моем package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Я хочу установить переменные окружения (например, NODE_ENV
) в скрипте запуска, при этом оставаясь на возможности запускать приложение одной командой, npm start
.
5 ответ(ов)
Чтобы установить переменную окружения в команде скрипта, вы можете изменить ваш package.json
следующим образом:
...
"scripts": {
"start": "node app.js",
"test": "NODE_ENV=test mocha --reporter spec"
},
...
После этого вы можете использовать process.env.NODE_ENV
в вашем приложении для получения значения переменной окружения.
Обратите внимание: этот способ работает только для Mac и Linux. Для Windows смотрите комментарии.
Если вы часто работаете с несколькими переменными окружения, имеет смысл хранить их в отдельном файле .env
(не забудьте исключить этот файл из контроля версий). В Linux вы можете использовать следующую команду, чтобы установить переменные окружения перед запуском вашего приложения:
export $(cat .env | xargs) &&
Пример файла .env
:
VAR_A=Hello World
VAR_B=Сделайте файл .env таким, чтобы новые переменные отделялись переводом строки
Пример index.js
:
console.log('Test', process.env.VAR_A, process.env.VAR_B);
Пример package.json
:
{
...
"scripts": {
"start": "node index.js",
"env-linux": "export $(cat .env | xargs) && env",
"start-linux": "export $(cat .env | xargs) && npm start",
"env-windows": "(for /F \"tokens=*\" %i in (.env) do set %i)",
"start-windows": "(for /F \"tokens=*\" %i in (.env) do set %i) && npm start",
}
...
}
К сожалению, я не смог установить переменные окружения, вызывая скрипт из другого скрипта — например, "start-windows": "npm run env-windows && npm start"
, что приводит к некоторой избыточности в скриптах.
Для тестирования переменных окружения вы можете выполнить команду npm run env-linux
или npm run env-windows
, а чтобы проверить, попадают ли они в ваше приложение, выполните npm run start-linux
или npm run start-windows
.
Я хотел бы добавить свои два копейки для будущих исследователей Node. На моем Ubuntu 14.04 команда NODE_ENV=test
не сработала, мне пришлось использовать export NODE_ENV=test
, после чего команда NODE_ENV=test
заработала тоже, странно.
Что касается Windows, то, как уже упоминалось, вам нужно использовать set NODE_ENV=test
. Однако для кросс-платформенного решения библиотека cross-env
не оказалась полезной, и возникает вопрос: действительно ли вам нужна библиотека для этого:
export NODE_ENV=test || set NODE_ENV=test && yadda yadda
Вертикальные черты нужны, так как в противном случае Windows выдает ошибку на нераспознанную команду export NODE_ENV
. Я не знаю, как обстоят дела с пробелом в конце, но для верности я тоже убрал их.
Попробуйте сделать это на Windows, заменив YOURENV
на ваше значение:
{
...
"scripts": {
"help": "set NODE_ENV=YOURENV && tagove help",
"start": "set NODE_ENV=YOURENV && tagove start"
}
...
}
С помощью этой команды вы устанавливаете переменную окружения NODE_ENV
и затем запускаете скрипт tagove
. Не забудьте заменить YOURENV
на фактическое значение, которое вы хотите использовать.
Вот перевод вашего сообщения на русский язык в стиле ответа на StackOverflow:
Ответ @luke почти полностью соответствовал тому, что мне нужно было! Спасибо.
Так как выбранный ответ достаточно прямолинеен (и верен), но уже устарел, я хотел бы предложить альтернативу для импорта переменных из отдельного файла .env при запуске ваших скриптов и устранить некоторые ограничения ответа Люка. Попробуйте следующее:
# Таким образом, вы можете использовать комментарии в своих .env файлах
NODE_PATH="src/"
# Вы также можете иметь дополнительные/пустые строки в нем
SASS_PATH="node_modules:src/styles"
Затем в вашем package.json вы создадите скрипт, который установит переменные и запустит его перед скриптами, где они нужны:
scripts: {
"set-env": "export $(cat .env | grep \"^[^#;]\" | xargs)",
"storybook": "npm run set-env && start-storybook -s public"
}
Несколько замечаний:
- Регулярное выражение в команде grep'ом очистит комментарии и пустые строки.
&&
не нужно "склеивать" сnpm run set-env
, как было бы необходимо, если бы вы устанавливали переменные в одной команде.- Если вы используете yarn, вы можете увидеть предупреждение, вы можете либо изменить его на
yarn set-env
, либо использоватьnpm run set-env --scripts-prepend-node-path &&
вместо этого.
Разные окружения
Еще одно преимущество использования этого метода в том, что у вас могут быть разные переменные окружения.
scripts: {
"set-env:production": "export $(cat .production.env | grep \"^[^#;]\" | xargs)",
"set-env:development": "export $(cat .env | grep \"^[^#;]\" | xargs)",
}
Пожалуйста, не забудьте не добавлять файлы .env в ваш git-репозиторий, если в них содержатся ключи, пароли или чувствительные/личные данные!
В чем разница между тильдой (~) и каретом (^) в package.json?
Как удалить модули npm в Node.js?
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Ошибка "npm WARN package.json: Нет поля repository"
nvm постоянно "забывает" Node.js в новой сессии терминала