envirius
— универсальный менеджер виртуальных окружений.
- envirius
- Установка
- Удаление
- Доступные плагины
- Как пользоваться?
- Как добавить плагин?
- Зависимости
- Поддерживаемые ОС
- Тестирование
- История изменений
- Лицензия
Обычно подобные утилиты узко специализированы под какой-то конкретный язык программирования. Например:
- virtualenv для python
- rvm для ruby
- kerl для erlang
- nvm/nodeenv для node.js
- и так далее
Но не редки случаи, когда в одном и том же окружении необходимо иметь
более одного языка программирования. Например, создать виртуальное окружение
с 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
плагинов меньше, чем плагинов, которые собираются из исходных
кодов.
➥ 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) ➥ exit
➥ echo $$
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
➥ 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() {
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
}
Эта функция должна возвращать полный url для скачивания архива для установки плагина. Например:
plug_url_for_download() {
local version=$1
echo "http://nodejs.org/dist/v${version}/node-v${version}.tar.gz"
}
Эта функция необходимо лишь тогда, когда вы делаете плагин для предварительно собранного языка и необходимо лишь скачать архив и распокавать его. Эта функция переопределяет процесс сборки, так как в этом случае, сборка нам не нужно, а нужно лишь скопировать бинарники. Например:
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.