Skip to content

Latest commit

 

History

History
439 lines (341 loc) · 17.3 KB

README.ru.md

File metadata and controls

439 lines (341 loc) · 17.3 KB

envirius

envirius — универсальный менеджер виртуальных окружений.

Содержание

Идея

Обычно подобные утилиты узко специализированы под какой-то конкретный язык программирования. Например:

Но не редки случаи, когда в одном и том же окружении необходимо иметь более одного языка программирования. Например, создать виртуальное окружение с python2.6 и node.js 0.10.24. Именно такая идея и лежит в основе envirius.

Кроме того, поддержка новых языков программирования реализована в виде плагинов. То есть, процедура добавления поддержки нового языка максимальна унифицирована (подробности — см. ниже).

Особенности

  • простой и ясный дизайн
  • легкая расширяемость
  • покрытие тестами

Установка

Установка тривиальна:

$ git clone git@github.com:ekalinin/envirius.git
$ cd envirius
$ make install

Далее, необходимо прописать в своём .bashrc файле следующие комманды:

[ -f "$HOME/.envirius/nv" ] && . ~/.envirius/nv

Удаление

Удаление так же тривиально, как и установка:

$ cd envirius
$ make uninstall

Доступные плагины

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

Как пользоваться?

Список поддерживаемых плагинов

➥ nv ls-plugins
elixir
elixir-prebuilt
erlang
go-prebuilt
haskell
haskell-prebuilt
julia
node
node-prebuilt
python
rust
rust-prebuilt
scala

В настоящее время есть 2 типа плагинов:

  • те, которые собирают язык из исходников (например, elixir, erlang)
  • те, которые скачивают уже собранный бинарник под платформу (например, elixir-prebuilt, go-prebuilt)

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

К сожалению, не все языки доступны в предварительно собранных пакетах. Поэтому *-prebuilt плагинов меньше, чем плагинов, которые собираются из исходных кодов.

Cписок доступных версий для каждого из плагинов

➥ nv ls-versions --rust --erlang
* rust:
0.1         0.2         0.3         0.4         0.5
0.6         0.7         0.8         0.9
* erlang:
R10B-0    R10B-10   R10B-1a   R10B-2    R10B-3    R10B-4
R10B-5    R10B-6    R10B-7    R10B-8    R10B-9    R11B-0
R11B-1    R11B-2    R11B-3    R11B-4    R11B-5    R12B-0
R12B-1    R12B-2    R12B-3    R12B-4    R12B-5    R13A
R13B      R13B01    R13B02-1  R13B02    R13B03    R13B04
R14A      R14B      R14B01    R14B02    R14B03    R14B04
R15B      R15B01    R15B02    R15B02    R15B03-1  R15B03
R16A      R16B      R16B01    R16B02    R16B03-1  R16B03
17.0-rc1

Создать окружение

➥ nv mk mixed-rust-erlang --rust=0.9 --erlang=17.0-rc1
Creating environment: mixed-rust-erlang ...
 * installing rust==0.9 ...
 * done (in 5 secs.)
 * installing erlang==17.0-rc1 ...
 * done (in 11 secs.)

Если необходимо активировать окружение сразу после создания, то:

➥ nv mk mixed-rust-erlang --rust=0.9 --erlang=17.0-rc1 --on
Creating environment: mixed-rust-erlang ...
....
Environment mixed-rust-erlang activated.
(mixed-rust-erlang) ➥ 

Активация/деактивация окружения

Активация в новой оболочке

По-умолчанию, окружение активируется в новой shell-оболочке:

echo $$
112
➥ nv on mixed-rust-erlang
Environment mixed-rust-erlang activated.
(mixed-rust-erlang) ➥  echo $$
3437

То есть, чтобы выключить окружение, необходимо выйти из новой оболочки, то есть, использовать exit или Ctrl-D:

(mixed-rust-erlang) ➥  echo $$
3437
(mixed-rust-erlang) ➥  exitecho $$
112

Начиная с версии 0.7.2 можно использовать nv off во всех случаях для выхода из окружения.

Активация в текущей оболочке

Если необходимо активировать окружение в текущем экземпляре оболочки, то:

echo $$
5099
➥ nv on --same-shell mixed-rust-erlang
Environment mixed-rust-erlang activated.
(mixed-rust-erlang) ➥  echo $$
5099

Чтобы выйти из окружения используйте nv off, а не exit:

(mixed-rust-erlang) ➥  echo $$
5099
(mixed-rust-erlang) ➥ nv off
Environment mixed-rust-erlang was deactivated.
➥  echo $$
5099

Cписок окружений

➥ nv ls
Available environment(s):
mixed-rust-erlang
rust-0.9
erl-17-rc1

Активное окружение

(mixed-rust-erlang) ➥ nv current
mixed-rust-erlang

Если никакого окружения не активировано, то вернется пустая строка:

➥ nv current
➥ 

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

➥ nv do node-0.10.26 'npm -g ls'

Помощь

➥ nv --help

Помощь для команды

Например, для команды do:

➥ nv do --help

Как добавить плагин?

Плагины находятся в директории nv-plugins. То есть, чтобы добавить плагин, нужно разместить его именно в этой директории.

Обязательные элементы

Если вы делаете плагин, который будет собирать всё сам из исходников, то в самом типовом случае достаточно реализовать 2 функции:

plug_list_versions

Эта функция должна возвращать список доступных версий плагина. Например:

plug_list_versions() {
    local versions=$(curl -s "http://nodejs.org/dist" | \
                grep -v "node-" | \
                egrep -o '[0-9]+\.[0-9]+\.[0-9]+' | \
                sort -u -k 1,1n -k 2,2n -k 3,3n -t .)
    echo $versions
}

plug_url_for_download

Эта функция должна возвращать полный url для скачивания архива для установки плагина. Например:

plug_url_for_download() {
    local version=$1
    echo "http://nodejs.org/dist/v${version}/node-v${version}.tar.gz"
}

plug_build

Эта функция необходимо лишь тогда, когда вы делаете плагин для предварительно собранного языка и необходимо лишь скачать архив и распокавать его. Эта функция переопределяет процесс сборки, так как в этом случае, сборка нам не нужно, а нужно лишь скопировать бинарники. Например:

plug_build() {
    local src_path=$1
    local build_path=$2
    cp -r "$src_path"/*/* "$build_path"
}

Если процедура установки плагина не типична, то можно вместо функции plug_url_for_download (или в дополнение к ней) объявить функцию plug_install, реализующую полную логику сборки плагина и его установки в новое виртуальное окружение. Дефолтную реализацию этой функции можно посмотреть в файле src/nv-commands/mk.

Необязательные элементы

Переменные

  • plug_list_versions_columns_count — определяющая, сколько будет колонок в выводе комманды nv versions для данного плагина.
  • plug_list_versions_columns_size — переменная, определяющая, ширину колонки в символах в выводе комманды nv versions для данного плагина.
  • plug_state — если переменная имеет значение disabled, то данный плагин считается неактивным, и не будет учитываться при выполнении комманд:
    • mk
    • ls-versions
    • ls-plugins

Функции

Функции перечислены в порядке их вызова в плагине:

  • plug_check_deps — проверяет наличие зависимостией для плагина. Если возвращает непустую строку, то создание окружение прекращается. Пример можно посмотреть в haskell плагине
  • plug_install — переопределить весь процесс создания окружения
  • plug_download — переопределить процесс скачивания архива
  • plug_unpack — переопределить распаковку: tar xzf <archive-with-source>
  • plug_configure — переопределить конфигурацию: configure --prefix=<path-to-env>
  • plug_build — переопределить сборку make && make install
  • plug_build_env — переопределить копирование собранных бинарников в директрию окружения
  • plug_post_install_actions — дополнительные действия после установки бинарников в окружение. Например, установка pip в плагине для python.

Зависимости

  • bash / zsh (базовая поддержка)
  • curl / wget (для скачивания архивов)
  • tar
  • git
  • gcc (для компиляции)
  • bats (для тестирования)

Поддерживаемые ОС

  • ubuntu

Тестирование

Большая часть кода покрыта тестами. Для тестирования использован фреймворк bats. Чтобы выполнить тесты:

➥ make tests

С горячим кэшем (то есть, например, исходники elang/rust уже скачаны и собраны бинарники) на Intel(R) Core(TM) i7-3517U CPU @ 1.90GHz с 4 GB of RAM в Ubuntu 13.10 (32-bits) тесты занимают:

time make tests
...

100 tests, 0 failure

real    8m26.572s
user    1m17.428s
sys     2m25.352s

История изменений

См. файл CHANGELOG.md.

Лицензия

См. файл LICENSE.