Как-то раз в одном из выпусков Разбор Полетов услышал про отличную и удобную консольную штуку: 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