envirius
— universal virtual environments manager.
- Envirius
- Installation
- Uninstallation
- Available plugins
- Usage
- Check available plugins
- Check available versions for each plugin
- Create an environment
- Activate/deactivate environment
- Get list of environments
- Get current activated environment
- Do something in environment without enabling it
- Export environment into tar archive
- Import environment from tar archive
- Get help
- Get help for a command
- How to add a plugin?
- Example of the usage
- Dependencies
- Supported OS
- Tests
- Version History
- License
- README in another language
Usually this kind of tools narrowly specialized for a particular programming language. For example:
- virtualenv for python
- rvm for ruby
- kerl for erlang
- nvm/nodeenv for node.js
- and so on
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).
- clean design
- easy extensible
- test coverage
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:
- which downloads & builds from source (
elixir
,erlang
, …) - which just downloads prebuilt packages (
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 thenv ls-version
for each pluginplug_list_versions_columns_size
— each column width in chars in the output of thenv ls-version
for each pluginplug_state
— if ==disabled
then plugin is not active and will not be account in the commands:- mk
- ls-versions
- ls-plugins
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 defaulttar xzf <archive-with-source>
plug_configure
— overrides defaultconfigure --prefix=<path-to-env>
plug_build
— overrides defaultmake && make install
plug_build_env
— overrides copying binaries into new environmentplug_post_install_actions
— executes after installation. For examplepip
installation in the python plugin
Here 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
- bash / zsh (very basic support)
- curl / wget
- tar
- git
- gcc
- bats
- ubuntu
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.