Universal Virtual Environments Manager
envirius
— universal virtual environments manager.
Usually this kind of tools narrowly specialized for a particular programming language. For example:
But there are many cases when in the same environment you must have more
than one programming language. For example, to create an environment with
python2.6
and node.js 0.10.24
. This idea underlies envirius
.
Support for new programming languages are implemented as plug-ins (see below).
At first:
$ git clone https://github.com/ekalinin/envirius.git
$ cd envirius
$ make install
Then youd need to add into your .bashrc
the following:
[ -f "$HOME/.envirius/nv" ] && . ~/.envirius/nv
Just do the following:
$ cd envirius
$ make uninstall
Cache and previously created environments will not be deleted.
You can create environments for the following programming languages:
New languages can be added as plugins (see below).
➥ nv ls-plugins
elixir
elixir-prebuilt
erlang
go-prebuilt
haskell
haskell-prebuilt
iojs
iojs-prebuilt
julia
node
node-prebuilt
python
rust
rust-prebuilt
scala
Here you can see two types of plugins:
elixir
, erlang
, …)elixir-prebuilt
, node-prebuilt
, …)It's obviously that work with the second option will be much faster because compiling may takes huge amount of time.
Unfortunately, not all languages is available in prebuilt binaries.
➥ 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.)
If you want to activate new environment just right after it creation, then do the following:
➥ 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) ➥
By default activating environment executes in a new shell:
➥ echo $$
112
➥ nv on mixed-rust-erlang
Environment mixed-rust-erlang activated.
(mixed-rust-erlang) ➥ echo $$
3437
So for exit just do exit
:
(mixed-rust-erlang) ➥ echo $$
3437
(mixed-rust-erlang) ➥ exit
➥ echo $$
112
Since version 0.7.2
you can use nv off
in all cases to exit from environment.
If you want to activate environment in the same shell do the following:
➥ echo $$
5099
➥ nv on --same-shell mixed-rust-erlang
Environment mixed-rust-erlang activated.
(mixed-rust-erlang) ➥ echo $$
5099
To deactivate this shell don't use exit
, use nv off
:
(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
It will return empty, if environment is not activated:
➥ nv current
➥
➥ nv do node-0.10.26 'npm -g ls'
➥ nv export node-0.10.26
Environment php-5.5.11 archived into /home/user/current/directory/node-0.10.26.tar
➥ nv import /home/user/current/directory/node-0.10.26.tar node-0.10.26-new
Archive /home/user/current/directory/node-0.10.26.tar imported into node-0.10.26-new
➥ nv --help
For example, for do
command:
➥ nv do --help
All plugins are in the directory nv-plugins. If you need to add support for a new language you should add it as plugin inside this directory.
If you create a plugin which builds all stuff from source then In a simplest case you need to implement 2 functions in the plugin's body:
This function should return list of available versions of the plugin. For example:
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
}
This function should return full url for downloading tarball. For example:
plug_url_for_download() {
local version=$1
echo "http://nodejs.org/dist/v${version}/node-v${version}.tar.gz"
}
This function is only need for *-prebuilt
-like plugins. It overrides default
building proccess. All we need in case of *-prebuilt
-like plugin is only
copy binaries. For example:
plug_build() {
local src_path=$1
local build_path=$2
cp -r "$src_path"/*/* "$build_path"
}
Typical language installation listed in
plug_install_default
function in mk
command.
If installation is not typical then you should implement plug_install
function with yourself. For example:
julia.
plug_list_versions_columns_count
— number of the columns in the
output of the nv ls-version
for each pluginplug_list_versions_columns_size
— each column width in chars in
the output of the nv ls-version
for each pluginplug_state
— if == disabled
then plugin is not active and will not
be account in the commands:
In execute order:
plug_check_deps
— check dependencies before plugin building. If it returns
not empty string then environment creation stops. Example is in
haskell
pluginplug_install
— overrides the whole installation processplug_download
— overrides default downloading sources (archive)plug_unpack
— overrides default tar xzf <archive-with-source>
plug_configure
— overrides default configure --prefix=<path-to-env>
plug_build
— overrides default make && make install
plug_build_env
— overrides copying binaries into new environmentplug_post_install_actions
— executes after installation. For example
pip
installation in the
python
pluginHere is an example of building hugo static
site generator under envirius with go
plugin:
$ whereis go
go:
$ nv mk go-hugo-test --go=1.2.1
Creating environment: go-hugo-test ...
* installing go==1.2.1 ...
* done (in 8 secs.)
$ nv ls
Available environment(s):
go-hugo-test (go==1.2.1)
$ nv on go-hugo-test
(go-hugo-test) $ go get github.com/spf13/hugo
(go-hugo-test) $ cd $GOPATH/src/github.com/spf13/hugo
(go-hugo-test) $ go build -o hugo main.go
(go-hugo-test) $ hugo version
Hugo Static Site Generator v0.11-dev
Most of the code is covered by tests. For testing bats was used. To run tests:
➥ make tests
With hot cache on Intel(R) Core(TM) i7-3517U CPU @ 1.90GHz
with 4 GB of RAM
on Ubuntu 13.10 (32-bits) tests takes:
➥ time make tests
...
100 tests, 0 failure
real 8m26.572s
user 1m17.428s
sys 2m25.352s
See CHANGELOG.md.
See LICENSE.