Работа с файлами .env при помощи env-cmd

Переменные окружения позволяют переключаться между локальной разработкой, подготовительной средой, пользовательским приемочным тестированием (UAT), производственной средой и любыми другими средами, которые являются частью рабочего процесса вашего проекта.

Вместо того чтобы по отдельности передавать переменные в скрипты, с помощью env-cmd вы можете группировать их в файлах окружения (.env) и передавать эти группы в скрипт.

В этом мануале вы узнаете, как установить env-cmd и использовать его (на примере простого тестового проекта).

Требования

Примечание: Это руководство использует команды для env-cmd версии 9.0.0+.

Руководство проверено на версиях Node v15.14.0, npm v7.10.0 и env-cmd v10.0.1.

1: Настройка проекта

В этом руководстве предполагается, что у вас уже есть простой тестовый проект. Давайте подготовим его к работе с переменными.

Сначала создайте новый каталог:

mkdir env-cmd-example

Перейдите в него:

cd env-cmd-example

Передавать файлы среды в систему управления версиями, как правило, не рекомендуется. Если доступ к репозиторию могут получить посторонние, они найдут там ваши учетные данные (поскольку они будут навсегда записаны в историю проекта системой контроля версий).

Потому файлы окружения рекомендуется поместить в .gitignore.

Примечание: Мы не требуем добавлять файлы в gitignore в рамках этого мануала, но в образовательных целях коротко расскажем, как это делается.

Инициализируйте новый проект git:

git init

Создайте файл .gitignore и добавьте в него следующие шаблоны, чтобы исключить файлы окружения:

.env
.env.js
.env.json
.env-cmdrc

В этом руководстве можно исключить .env, .env.js, .env.json и .env-cmdrc.

Затем создайте для проекта файл .env.

Откройте его в редакторе кода и добавьте следующую строку:

creature=shark
green=#008f68
yellow=#fae042

Это определяет три переменные: creature со значением shark, green со значением #008f68 и yellow со значением #fae042.

Затем создайте новый файл log.js и поместите в него такие строки:

console.log('NODE_ENV:', process.env.NODE_ENV);
console.log('Creature:', process.env.creature);
console.log('Green:', process.env.green);
console.log('Yellow:', process.env.yellow);

Этот файл будет записывать ранее определенные переменные в консоль. Также он выведет значение NODE_ENV.

Теперь наше тестовое приложение подготовлено к использованию файлов окружения и env-cmd.

2: Использование env-cmd

Современные утилиты npm и yarn могут запускать env-cmd, не внося его в зависимости.

Используйте либо npx:

npx env-cmd node log.js

Или yarn run:

yarn run env-cmd node log.js

Также вы можете установить пакет как зависимость или devDependency:

npm install env-cmd@10.0.1

Пакет env-cmd устанавливает исполняемый сценарий env-cmd, который можно вызывать перед другими сценариями, чтобы легко загрузить переменные среды из внешнего файла.

В зависимости от ваших настроек вы можете ссылаться на env-cmd несколькими способами.

Возможно, наиболее совместимым с пакетными менеджерами вариантом является добавление пользовательского скрипта в файл package.json:

{
  "scripts": {
    "print-log": "env-cmd node log.js"
  }
}

Например, вы сможете запустить этот сценарий с помощью npm:

npm run print-log

Если вы предпочитаете использовать env-cmd непосредственно через командную строку, вы можете вызвать его из node_modules:

./node_modules/.bin/env-cmd node log.js

В дальнейшем в этом руководстве будет использоваться npx, но все описанные выше подходы одинаково хороши.

Теперь запустите сценарий в своем терминале.

Независимо от того, как вы запустите его, env-cmd загрузит файл .env, а сценарий логирования сообщит о переменных.

NODE_ENV: undefined
Creature: shark
Green: #008f68
Yellow: #fae042

Как вы могли заметить, значение NODE_ENV не определено, undefined. Это потому, что переменная NODE_ENV не была определена в файле .env.

Передать NODE_ENV можно перед вызовом env-cmd. К примеру, вот команда для npx, которая сделает это:

NODE_ENV=development npx env-cmd node log.js

Снова запустите команду с определенной NODE_ENV, и вы получите такой результат:

NODE_ENV: development
Creature: shark
Green: #008f68
Yellow: #fae042

Теперь вы знаете, как использовать env-cmd с файлом .env.

3: Форматы файлов

env-cmd по умолчанию ожидает встретить файл .env в корневом каталоге проекта. Однако вы можете изменить тип файла и путь с помощью параметра –file (-f).

Есть множество форматов файлов, доступных для хранения переменных окружения.

Файл JSON

Вот пример файла .env.json:

{
  "creature": "shark",
  "green": "#008f68",
  "yellow": "#fae042"
}

А вот пример использования этого формата для файла env-cmd:

NODE_ENV=development npx env-cmd --file .env.json node log.js

Файлы окружения в формате JavaScript

Вот пример файла .env.js:

module.exports = {
  creature: 'shark',
  green: '#008f68',
  yellow: '#fae042'
};

А вот пример файла env-cmd в этом формате:

NODE_ENV=development npx env-cmd --file .env.js node log.js

RC-файлы

Формат файла rc (или runcom) особенный: он позволяет определять несколько сред в одном файле JSON и ссылаться на среду по имени, а не по файлу.

Еще одна особенность файла rc заключается в том, что он должен называться .env-cmdrc и находиться в корневом каталоге проекта.

Вот пример файла .env-cmdrc с определенными средами разработки и производства и промежуточной средой:

{
  "development": {
    "NODE_ENV": "development",
    "creature": "shark",
    "green": "#008f68",
    "yellow": "#fae042",
    "otherVar1": 1
  },
  "staging": {
    "NODE_ENV": "staging",
    "creature": "whale",
    "green": "#6db65b",
    "yellow": "#efbb35",
    "otherVar2": 2
  },
  "production": {
    "NODE_ENV": "production",
    "creature": "octopus",
    "green": "#4aae9b",
    "yellow": "#dfa612",
    "otherVar3": 3
  }
}

Для использования значений из файла .env-cmdrc потребуется параметр –environments (-e).

Затем вы можете сослаться на одну из сред в файле с помощью команды:

npx env-cmd --environments development node log.js

Вы даже можете ссылаться на несколько сред, что объединит все переменные среды (причем последняя среда будет иметь приоритет, если одни и те же переменные встречаются в нескольких средах, но имеют разные значения):

npx env-cmd --environments development,staging,production node log.js

Указав все три среды, мы установим три разные переменные otherVar, а остальные переменные будут извлечены из последней указанной среды, production.

4: Флаг –fallback

В ситуациях, когда пользовательский файл окружения отсутствует:

npx env-cmd -f .env.missing node log.js

env-cmd выдаст ошибку:

Error: Failed to find .env file at path: .env.missing

Если возникает непредвиденная проблема с пользовательским путем к файлу env, env-cmd может попытаться загрузить файл .env из корневого каталога проекта. Для этого передайте флаг –fallback:

npx env-cmd --file .env.missing --fallback node log.js

Если теперь у вас есть валидный файл .env, эта команда не будет отображать никаких ошибок.

5: Флаг –no-override

В некоторых ситуациях возникает необходимость сохранить все или некоторые из переменных, уже установленных в среде.

Чтобы оставить существующие переменные среды (но не писать значения в файле .env), передайте env-cmd флаг –no-override:

NODE_ENV=development creature=squid npx env-cmd --no-override node log.js

Эта команда вернет такой результат:

NODE_ENV: development
Creature: squid
Green: #008f68
Yellow: #fae042

Обратите внимание, значение creature имеет значение squid вместо shark, которое было определено в файле .env.

Заключение

В этой статье вы изучили основы использования env-cmd на примере простого проекта.

Файлы окружения помогут вам легко переключаться между средами разработки и производства.

Tags:

Добавить комментарий