6

Как задать переменные окружения из файла package.json?

1

Как установить переменные окружения из файла package.json для использования с командами типа npm start?

У меня есть следующий код в моем package.json:

{
  ...
  "scripts": {
    "help": "tagove help",
    "start": "tagove start"
  }
  ...
}

Я хочу установить переменные окружения (например, NODE_ENV) в скрипте запуска, при этом оставаясь на возможности запускать приложение одной командой, npm start.

5 ответ(ов)

7

Чтобы установить переменную окружения в команде скрипта, вы можете изменить ваш package.json следующим образом:

...
"scripts": {
  "start": "node app.js",
  "test": "NODE_ENV=test mocha --reporter spec"
},
...

После этого вы можете использовать process.env.NODE_ENV в вашем приложении для получения значения переменной окружения.

Обратите внимание: этот способ работает только для Mac и Linux. Для Windows смотрите комментарии.

0

Если вы часто работаете с несколькими переменными окружения, имеет смысл хранить их в отдельном файле .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.

0

Я хотел бы добавить свои два копейки для будущих исследователей 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. Я не знаю, как обстоят дела с пробелом в конце, но для верности я тоже убрал их.

0

Попробуйте сделать это на Windows, заменив YOURENV на ваше значение:

{
  ...
  "scripts": {
    "help": "set NODE_ENV=YOURENV && tagove help",
    "start": "set NODE_ENV=YOURENV && tagove start"
  }
  ...
}

С помощью этой команды вы устанавливаете переменную окружения NODE_ENV и затем запускаете скрипт tagove. Не забудьте заменить YOURENV на фактическое значение, которое вы хотите использовать.

0

Вот перевод вашего сообщения на русский язык в стиле ответа на 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-репозиторий, если в них содержатся ключи, пароли или чувствительные/личные данные!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь