direnv — это расширение с открытым исходным кодом для вашей текущей оболочки в операционных системах на базе UNIX, таких как Linux и macOS. Оно поддерживает хуки для нескольких файлов запуска оболочки, таких как bash, zsh, или fish.
Основное преимущество использования direnv заключается в наличии изолированных переменных среды для отдельных проектов. Традиционный метод заключался в добавлении всех переменных среды в файлы запуска одной оболочки, которые могут быть ~/.bashrc, ~/.zsh, и config.fish в зависимости от вашей оболочки Linux.
Для direnv необходимо создать файл .envrc в каждом каталоге проекта и заполнить переменную среды, специфичную для проекта. Затем он загружает и выгружает переменные среды в зависимости от текущего каталога.
Зачем использовать Direnv?
Разработчики программного обеспечения могут использовать direnv для загрузки переменных среды приложения 12factor (методология создания приложений по принципу «программное обеспечение как услуга»), таких как файлы с секретными данными приложения, для развертывания.
Как работает Direnv?
Прежде чем оболочка загрузит командную строку, direnv проверяет наличие файлов .envrc или .env в текущем и родительском каталогах с соответствующими разрешениями. Предположим, что оба файла присутствуют, тогда приоритет отдается файлу .envrc .
Следующий файл загружается в подоболочку bash, и все переменные внутри файла перехватываются direnv, чтобы сделать их доступными для текущей оболочки Linux без ведома пользователя.
Установка Direnv в системах Linux
Пакет direnv доступен в репозиториях по умолчанию. Его можно установить с помощью текущего менеджера пакетов в большинстве дистрибутивов Linux, как показано ниже.
# Для Debian, Ubuntu, Mint, PopOS
sudo apt install direnv
# Для RedHat, Fedora, CentOS
sudo dnf install direnv
# Для Arch, Manjaro, EndeavourOS
yay -Sy direnv
В других дистрибутивах, таких как Red Hat или CentOS, вы можете воспользоваться пакетом direnv snaps, как показано ниже.
sudo snap install direnv
Подключите Direnv к вашей текущей оболочке
После установки вам нужно подключить direnv к вашей текущей оболочке Linux; без этого он не будет работать. В каждой оболочке есть свой механизм подключения расширений, таких как direnv.
Чтобы узнать, какая оболочка у вас установлена, выполните в терминале следующую команду:
echo $0 bash
Воспользуйтесь любым из перечисленных ниже способов в зависимости от вашей текущей оболочки Linux.
Для оболочки BASH
Добавьте следующую строку в конец файла ~/.bashrc:
eval "$(direnv hook bash)"
Для оболочки ZSH
Добавьте следующую строку в конец файла ~/.zsh .
eval "$(direnv hook zsh)"
Для Fish Shell
Добавьте следующую строку в конец файла ~/.config/fish/config.fish.
eval (direnv hook fish)
Наконец, закройте все активные сеансы терминала и выполните команду source для файлов запуска оболочки, как показано ниже.
# Для оболочки BASH
source ~/.bashrc
# Для оболочки ZSH
source ~/.zshrc
# Для оболочки Fish
source ~/.config/fish/config.fish
Как использовать Direnv
Давайте рассмотрим практическое применение direnv. Сначала мы создадим на нашем текущем пути новый каталог для демонстрации под названием ubuntushell_project и перейдём в него.
mkdir ubuntushell_project cd ubuntushell_project/
Давайте проверим, доступна ли переменная $TEST_VARIABLE в текущем пути проекта, с помощью команды echo, как показано ниже.
echo $TEST_VARIABLE Nope
Вместо пробела я заменил его на «nope«, что означает отсутствие глобальной или локальной переменной среды для $TEST_VARIABLE.
Затем мы создадим новый файл в текущем каталоге проекта (указывая ubuntushell_project) с именем .envrc и добавим $TEST_VARIABLE в файл с помощью команды echo, как показано ниже.
echo export TEST_VARIABLE=ubuntushell > .envrc direnv: загрузка ~/etw/.envrc direnv: export +TEST_VARIABLE
По умолчанию файл .envrc заблокирован. Поэтому нам нужно запустить команду direnv allow ., чтобы разблокировать его и разрешить загрузку содержимого .envrc в нашей оболочке Linux, как показано ниже.
direnv allow .
Давайте ещё раз проверим вывод $TEST_VARIABLE как показано ниже.
echo $TEST_VARIABLE ubuntushell
Тада! Мы успешно создали .envrc файл и загрузили его содержимое в нашу оболочку с помощью команды direnv .
Если вы сделаете шаг назад, чтобы выйти из текущего рабочего каталога (относящегося к ubuntushell_project), и выполните команду echo для $TEST_VARIABLE, то обнаружите, что содержимое пустое.
echo $TEST_VARIABLE Nope
Теперь, когда вы снова вошли в каталог ubuntushell_project, файл .envrc будет загружен в вашу оболочку bash вместе со своим содержимым.
Чтобы отозвать авторизацию файла .envrc и запретить загрузку его содержимого в текущую оболочку Linux, выполните следующую команду.
direnv deny .
Удаление Direnv
Предположим, вам не нравится Direnv и вы хотите удалить его из своей системы Linux. Тогда воспользуйтесь приведённой ниже командой, чтобы удалить Direnv из вашей системы.
# Для Debian, Ubuntu, Mint, PopOS
sudo apt purge direnv
# Для RedHat, Fedora, CentOS
sudo dnf remove direnv
# Для Arch, Manjaro, EndeavourOS
yay -Rs direnv
Выводы
Теперь, когда вы понимаете, как работает команда direnv, вы можете выполнить описанные выше действия, чтобы создать изолированную среду для конкретного проекта в системе Linux.