Как установить некоторые переменные среды изнутри package.json
для использования с npm start
подобными командами?
Вот что у меня сейчас есть в моем package.json
:
{
...
"scripts": {
"help": "tagove help",
"start": "tagove start"
}
...
}
Я хочу установить переменные окружения (например NODE_ENV
) в сценарии запуска, но при этом запускать приложение можно всего одной командой npm start
.
node.js
npm
package.json
npm-scripts
dev.meghraj
источник
источник
Ответы:
Установите переменную среды в команде сценария:
Тогда используйте
process.env.NODE_ENV
в своем приложении.Примечание:
env
гарантирует, что он работает на разных платформах. Вы можете опустить его, если заботитесь только о Mac / Linux.источник
set NODE_ENV=test&& mocha --reporter spec
- между тестом и && специально нет пробела."test": "NODE_ENV=test mocha --reporter spec"
не будет работать в системах Windows.env NODE_ENV=test mocha --reporter spec
будет использовать объявленную переменную окружения в кроссплатформенном режиме, но ключ в том, что она используется npm в одноразовом режиме, только для выполнения сценария npm. (Он не установлен или не экспортируется для использования в будущем.) Пока вы запускаете команду из сценария npm, проблем нет. Кроме того, "&&" должен быть удален при этом.Просто используйте кросс-env пакета NPM . Супер просто. Работает на Windows, Linux и во всех средах. Обратите внимание, что вы не используете && для перехода к следующей задаче. Вы просто устанавливаете env и затем запускаете следующую задачу. Кредит @mikekidder за предложение в одном из комментариев здесь.
Из документации:
Обратите внимание, что если вы хотите установить несколько глобальных переменных, вы просто должны указать их последовательно, а затем выполнить команду.
В конечном счете, команда, которая выполняется (используя spawn):
NODE_ENV
Переменная будет установлена перекрестная окристочник
"test": "cross-env TS_NODE_COMPILER_OPTIONS='{\\\"module\\\":\\\"commonjs\\\"}' mocha"
env
илиcross-env
? С одной стороны, env не требует от меня установки чего-либо, а с другойcross-env
- более популярна. Может кто-нибудь подтвердить,env
работает ли на всех платформах?env
не работает как есть на всех платформах, отсюда и причинаcross-env
существования. Просто используйтеcross-env
и покончите с этим.Поскольку я часто нахожу себя работающим с несколькими переменными окружения, я считаю полезным хранить их в отдельном
.env
файле (не обращайте на это внимания из вашего контроля версий).Затем добавьте
export $(cat .env | xargs) &&
перед вашей командой сценария.Пример:
Для теста вы можете просмотреть переменные env, запустив
npm run env
(linux) илиnpm run env-windows
(windows).источник
&&
он заработал, мне пришлось удалить место. Если у вас есть несколько файлов .env, поддерживать его может быть немного сложнее. Ваш ответ вдохновил меня на подготовку этого предложения: stackoverflow.com/questions/25112510/…Я просто хотел добавить свои два цента сюда для будущих исследователей узлов. На моем Ubuntu 14.04
NODE_ENV=test
не работал, мне пришлось использовать,export NODE_ENV=test
после чегоNODE_ENV=test
тоже начал работать, странно.В Windows, как уже было сказано, вы должны использовать,
set NODE_ENV=test
но для кроссплатформенного решения библиотека кросс-env, похоже, не сработала, и вам действительно нужна библиотека для этого:Вертикальные черты нужны, так как в противном случае Windows зависнет по неизвестной
export NODE_ENV
команде: D. Не знаю, о том, что нужно сделать, но я тоже их убрал.источник
&&
?NODE_ENV=test yadda
означает «запуститьyadda
, установитьNODE_ENV
внутриyadda
переменных среды».NODE_ENV=test && yadda
означает «установитьNODE_ENV
в локальной среде, но не экспортировать его, а затем запуститьyadda
»NODE_ENV=test yadda
- это предпочтительный подход.NODE_ENV=test && npm run test
что-то подобное. Я сделал лучшее решение, используяprocess.env["NODE_ENV"] = "testing";
мой файл testhelper.js.&&
, потеряв переменные окружения, установка переменных окружения без экспорта работает только для текущей команды (что ничего). выполнить команду с переменным окр без экспорта U делать:NODE_ENV=test npm run test
. Наконец, причина того, что это сработало после экспорта, заключается в том, что переменная ur теперь доступна (экспортирована) в сеансе, а ваш NODE_ENV без экспорта ничего не делал.Попробуйте это в Windows, заменив
YOURENV
:источник
внезапно я обнаружил, что actionhero использует следующий код, который решил мою проблему, просто передав
--NODE_ENV=production
опцию команды запуска сценария.Я был бы очень признателен, если бы принял ответ от кого-то другого, кто знает, как лучше установить переменные окружения в package.json или сценарии инициализации или что-то вроде того, где приложение загружается кем-то другим.
источник
Для большего набора переменных среды или когда вы хотите использовать их повторно, вы можете использовать
env-cmd
../.env
файл:./package.json
:источник
process.env.ENV1
mongod --dbpath ~/data/db
. Я хочу запустить что-то подобное,npm mongodb
и это получит переменную окружения dbpath и запустит mondodb, как всегда ... и ... я хочу поделиться им с другими членами.Хотя я не отвечаю прямо на вопрос, я хотел бы поделиться идеей поверх других ответов. Из того, что я получил, каждый из них мог бы предложить некоторый уровень сложности для достижения кроссплатформенной независимости.
В моем сценарии все, что я хотел, первоначально, чтобы установить переменную, чтобы контролировать, защищать ли сервер с помощью аутентификации JWT (для целей разработки)
Прочитав ответы, я решил просто создать 2 разных файла с включенной и выключенной аутентификацией соответственно.
Файлы - это просто оболочки, которые вызывают оригинальный файл index.js (который я переименовал
appbootstrapper.js
):Возможно, это может помочь кому-то еще
источник
источник
Это будет работать в консоли Windows :
npm run aaa
вывод:
test
Смотрите этот ответ для деталей.
источник
set TMP=test&& npm run bbb
. Пробел до&&
этого также будет составлять частьNODE_ENV
строки"
.используйте git bash в windows. Git Bash обрабатывает команды не так, как cmd.
Большинство командных приглашений Windows будут задыхаться, когда вы устанавливаете переменные среды с NODE_ENV = production, подобным этому. (Исключением является Bash в Windows, который использует собственный Bash.) Аналогичным образом, существует разница в том, как команды Windows и POSIX используют переменные среды. В POSIX вы используете: $ ENV_VAR, а в Windows вы используете% ENV_VAR%. - перекрестный документ
используйте пакет dotenv для объявления переменных env
источник
Вы не должны устанавливать переменные ENV в
package.json
. actionhero использует,NODE_ENV
чтобы позволить вам изменять параметры конфигурации, которые загружаются из файлов в./config
. Проверьте файл конфигурации redis и посмотрите, как NODE_ENV использует для изменения параметров базы данных вNODE_ENV=test
Если вы хотите использовать другие переменные ENV для настройки (возможно, порт HTTP), вам все равно не нужно ничего менять
package.json
. Например, если вы установилиPORT=1234
в ENV и хотите использовать его в качестве порта HTTPNODE_ENV=production
, просто укажите это в соответствующем файле конфигурации, IE:источник
npm start
команде. Используя фрагмент кода выше, если вы хотите запустить сервер с помощью порта ENV было бы:export PORT=1234; npm start
. Вы можете добавить столько объявлений ENV, сколько вам нужно, но они не принадлежат файлу package.json. Если вы обеспокоены о том , что они существуют , вы должны использовать по умолчанию в файле конфигурации:port: process.env.PORT || 8080
.NODE_ENV=test npm start
или установить их с помощью оболочкиnpm (и пряжа) передает много данных из package.json в сценарии как переменные среды. Используйте,
npm run env
чтобы увидеть их всех. Это задокументировано в https://docs.npmjs.com/misc/scripts#environment и предназначено не только для сценариев «жизненного цикла», таких как,prepublish
но также для любых сценариев, выполняемыхnpm run
.Вы можете получить доступ к этим внутри кода (например,
process.env.npm_package_config_port
в JS), но они уже доступны для оболочки, выполняющей сценарии, так что вы также можете обращаться к ним как к$npm_...
расширениям в «сценариях» (синтаксис unix, может не работать в Windows?).Раздел "config", кажется, предназначен для этого использования:
Важным качеством этих полей «config» является то, что пользователи могут переопределять их, не изменяя package.json !
Смотрите npm config и документы по конфигурации пряжи .
Похоже, что пряжа читает
~/.npmrc
такnpm config set
влияет на обоих, ноyarn config set
пишет~/.yarnrc
, так что только пряжа будет видеть это :-(источник
Ответ @ Люка был почти тот, который мне был нужен! Спасибо.
Поскольку выбранный ответ очень простой (и правильный), но старый, я хотел бы предложить альтернативу для импорта переменных из отдельного файла .env при запуске ваших сценариев и исправления некоторых ограничений в ответе Люка. Попробуй это:
::: .env file :::
Затем в вашем пакете json вы создадите скрипт, который установит переменные и запустит их до того, как вам понадобятся скрипты:
::: package.json :::
Некоторые наблюдения:
Регулярное выражение в команде grep'ed cat удалит комментарии и пустые строки.
&&
Не нужно быть «склеены» вnpm run set-env
, как это было бы необходимо , если вы настраивали переменные в одной команде.Если вы используете пряжу, вы можете увидеть предупреждение, вы можете изменить его
yarn set-env
или использоватьnpm run set-env --scripts-prepend-node-path &&
вместо него.Разные среды
Еще одним преимуществом при его использовании является то, что вы можете иметь различные переменные среды.
источник