Вопрос или проблема
Я запускаю приложение на Node.js из VS Code. Я хотел сохранить свой пароль от базы данных в переменной окружения. Я экспортировал данные в терминале на своем Mac, и при выполнении команды echo я смог получить данные.
export MONGO_PASSWORD="PASSWORD"
echo $MONGO_PASSWORD // выводит пароль
Однако, когда я открываю встроенный терминал в VS Code, он не показывает значение.
echo $MONGO_PASSWORD // выводит пусто
Также, когда я подключился к CLI node и ввёл process.env, он не включает мою переменную.
process.env.MONGO_PASSWORD // выводит undefined
В качестве временного решения, я смог установить и экспортировать переменную из файла ~/.zshrc на своем Mac. Тем не менее, мне все еще любопытно, почему встроенный терминал VS Code не может читать значения, экспортированные в терминале Mac, и есть ли способ это исправить.
Мне все еще любопытно, почему встроенный терминал VS Code не может читать значения, экспортированные в терминале Mac, и есть ли способ это исправить.
В zsh
команда export
делает то, что заявляет в сопроводительной man
странице:
Указанные имена помечаются для автоматического экспорта в окружение последующих выполняемых команд […]
Экспорты в встроенном терминале в VS Code выполняются в отдельном экземпляре оболочки, который вы вызвали в Terminal.app, поэтому одна оболочка не знает имен, экспортированных в другой.
Нет способа “исправить” это поведение, так как оно работает так, как задумано.
Ответ или решение
Проблема, с которой вы столкнулись, связана с тем, как работает окружение оболочки в macOS и, в частности, с тем, как VS Code обрабатывает переменные окружения.
Когда вы устанавливаете переменную окружения с помощью команды export
в терминале macOS (Terminal.app), эта переменная экспортируется только в текущую сессию оболочки. Это означает, что она будет доступна только в этой конкретной сессии терминала. Когда вы открываете интегрированный терминал в VS Code, он начинает новую, отдельную сессию оболочки, которая не имеет доступа к переменным, установленным в другой сессии.
Поэтому, когда вы вводите echo $MONGO_PASSWORD
в интегрированном терминале VS Code, он возвращает пустое значение, потому что переменная MONGO_PASSWORD
была установлена только в окружении терминала, а не в глобальном окружении, доступном для всех сессий.
Решения:
-
Добавление переменных в конфигурацию оболочки: Как вы уже сделали, вы можете добавить переменные окружения в файл
~/.zshrc
(или~/.bash_profile
, если вы используете bash). Это обеспечит загрузку переменных при каждом новом запуске терминала, включая интегрированные терминалы в VS Code.export MONGO_PASSWORD="PASSWORD"
После внесения изменений в
~/.zshrc
обязательно выполните командуsource ~/.zshrc
, чтобы применить изменения, или просто перезапустите терминал. -
Установка переменных окружения непосредственно в VS Code: В настройках VS Code вы можете задать переменные окружения, которые будут доступны в интегрированном терминале. Это делается через файл конфигурации
.env
в корне вашего проекта или через настройки вsettings.json
. -
Проверка настроек терминала VS Code: Убедитесь, что VS Code использует ту же оболочку, что и ваш терминал. В настройках (
settings.json
) вы можете указать, какую оболочку использовать:"terminal.integrated.shell.osx": "/bin/zsh" // или путь к вашей оболочке
-
Использование файла
.env
для конфигурации: Если вы используете библиотеки, такие какdotenv
, вы можете создать файл.env
в корне вашего проекта и ввести туда ваши переменные окружения:MONGO_PASSWORD=PASSWORD
Затем, в вашем коде Node.js, вы можете загрузить эти переменные:
require('dotenv').config(); console.log(process.env.MONGO_PASSWORD);
Заключение
Изоляция окружений между разными сессиями оболочки — это стандартное поведение в UNIX-подобных системах, таких как macOS. Понимание этого поведения поможет вам более эффективно управлять переменными окружения и минимизировать путаницу в будущем. Выбор подходящего решения зависит от ваших нужд и предпочтений, но каждый из предложенных методов поможет вам решить вашу проблему.