Date Tags bash

Как-то раз в одном из выпусков Разбор Полетов услышал про отличную и удобную консольную штуку: direnv. Она позволяет выставлять необходимое окружение в зависимости от текущей директории. При этом для вложенных папок direnv окружение сохраняется (если не было переопределено), а при выходе из папки возвращается предыдущее рабочее окружение.

На Mac можно установить из brew. Или из исходников с github репозитория (пакетов для популярных дистрибутивов не видел). Для компиляции понадобится Go. Для Gentoo я добавил простенький ebuild в свой оверлей.

Использование предельно простое. Для начала надо добавить в файл инициализации вашего shell'а подобные строчки:

if which direnv > /dev/null; then
    eval "$(direnv hook $0)"
fi

Далее переходим в нужную директорию и обновляем для нее окружение:

$ cd <path/to/project>
$ direnv edit .

При этом открывается .envrc файл из текущей директории в вашем любимом $EDITOR. Сюда и добавляем необходимое окружение в достаточно привычном виде: export VAR=value. Например, для Android проектов я использую нечто вроде следующего:

export ANDROID_SDK=/Users/puzan/apps/android-sdk
export ANT_ARGS="-Dsdk.dir=${ANDROID_SDK}"

Теперь при переходе в папку <path/to/project> мы увидим следующее:

$ cd <path/to/project>
direnv: loading .envrc
direnv: export +ANDROID_SDK +ANT_ARGS
$ echo $ANDROID_SDK
/Users/puzan/apps/android-sdk
$ echo $ANT_ARGS 
-Dsdk.dir=/Users/puzan/apps/android-sdk

При выходе из директории, например на уровень выше, окружение выгрузится:

$ cd ..
direnv: unloading
$ echo $ANDROID_SDK

$ echo $ANT_ARGS 

$ 

Для Python проектов можно добавить создание внутреннего виртуального окружения. Помещаем слудующую строчку в .envrc:

layout python

При этом в папке ./.direnv/virtualenv/ будет создано виртуальное окружение и в $PATH будет добавлен правильный путь. Другие подобные возможности можно найти здесь или в исходниках.

Есть легкая возможность добавить свои функции. Наприме я добавил для себя возможнось указать, какое существующее Python виртуальное окружение из ~/.virtualenvs/ использовать. Для этого добавляем в файл ~/.direnvrc вот такую функцию:

# Usage: use venv <venv>
#
# Loads the specified python virtualenv
#
use_venv() {
    export VIRTUAL_ENV="${HOME}/.virtualenvs/${1}"
    PATH_add "$VIRTUAL_ENV/bin"
}

После этого в .envrc можно использовать следующую кострукцию:

use venv <venv_name>

В общем, возможности для расширения есть. Думаю можно разширить практически под любую задачу. На мой взгляд direnv очень удобная штука, позволяющая забыть про дополнительную настройку окружения новых проектов. Кроме того эта методика позволяет избежать захламления файлов инициализации.



Comments

comments powered by Disqus