• Stars
    star
    330
  • Rank 127,657 (Top 3 %)
  • Language
    Shell
  • License
    MIT License
  • Created almost 11 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Universal Virtual Environments Manager

envirius

envirius โ€” universal virtual environments manager.

Table of Contents

Idea

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).

Features

  • clean design
  • easy extensible
  • test coverage

Installation

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

Uninstallation

Just do the following:

$ cd envirius
$ make uninstall

Cache and previously created environments will not be deleted.

Available plugins

You can create environments for the following programming languages:

New languages can be added as plugins (see below).

Usage

Check available plugins

โžฅ 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.

Check available versions for each plugin

โžฅ 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

Create an environment

โžฅ 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) โžฅ 

Activate/deactivate environment

Activating in a new shell

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.

Activating in the same shell

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

Get list of environments

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

Get current activated environment

(mixed-rust-erlang) โžฅ nv current
mixed-rust-erlang

It will return empty, if environment is not activated:

โžฅ nv current
โžฅ 

Do something in environment without enabling it

โžฅ nv do node-0.10.26 'npm -g ls'

Export environment into tar archive

โžฅ nv export node-0.10.26
Environment php-5.5.11 archived into /home/user/current/directory/node-0.10.26.tar

Import environment from tar archive

โžฅ 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

Get help

โžฅ nv --help

Get help for a command

For example, for do command:

โžฅ nv do --help

How to add a plugin?

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.

Mandatory elements

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:

plug_list_versions

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
}

plug_url_for_download

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"
}

plug_build

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.

Optional elements

Variables

  • plug_list_versions_columns_count โ€” number of the columns in the output of the nv ls-version for each plugin
  • plug_list_versions_columns_size โ€” each column width in chars in the output of the nv ls-version for each plugin
  • plug_state โ€” if == disabled then plugin is not active and will not be account in the commands:
    • mk
    • ls-versions
    • ls-plugins

Functions

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 plugin
  • plug_install โ€” overrides the whole installation process
  • plug_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 environment
  • plug_post_install_actions โ€” executes after installation. For example pip installation in the python plugin

Examples

Example of the usage

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

Dependencies

  • bash / zsh (very basic support)
  • curl / wget
  • tar
  • git
  • gcc
  • bats

Supported OS

  • ubuntu

Tests

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

Version History

See CHANGELOG.md.

License

See LICENSE.

README in another language

RU

More Repositories

1

github-markdown-toc

Easy TOC creation for GitHub README.md
Shell
3,104
star
2

nodeenv

Virtual environment for Node.js & integrator with virtualenv
Python
1,634
star
3

sitemap.js

Sitemap-generating framework for node.js
TypeScript
1,577
star
4

Dockerfile.vim

Vim syntax file & snippets for Docker's Dockerfile
Vim Script
692
star
5

github-markdown-toc.go

Easy TOC creation for GitHub README.md (in go)
Go
486
star
6

typogr.js

Typography utils for javascript
JavaScript
296
star
7

nodeguide.ru

nodeguide.ru
CSS
176
star
8

awsping

Console tool to check the latency to each Amazon EC2 region
Go
156
star
9

pip-bash-completion

bash autocompletion for pip
Shell
77
star
10

robots.js

Parser for robots.txt for node.js
JavaScript
65
star
11

operating-systems-three-easy-pieces-pdf

Tool for single pdf creation from http://ostep.org
Python
34
star
12

rust-bookmarks

Bookmarks about rust programming language
14
star
13

erlang-libs

Listing of useful erlang libraries
JavaScript
8
star
14

btxer

Simple bitcoin transactions tracker
Go
8
star
15

docker-uptime

A Dockerfile that installs the latest mongodb, nodejs and uptime
Shell
7
star
16

docker-munin-nginx

A Dockerfile that installs munin, nginx, and sshd
Shell
5
star
17

docker-sentry-postgres

A Dockerfile that installs sentry, postgres, and sshd
Python
5
star
18

virtualenv-bash-completion

bash completion for virtualenv
3
star
19

veco

Shell wrapper for the most popular version control systems
Shell
3
star
20

algo.rs

Rust
2
star
21

erlang-iptables

Simple Erlang wrapper to iptables
Erlang
2
star
22

pbvm

Protocol Buffers Version Manager
Go
2
star
23

flask-noextref

Provides support for hiding external URL for Flask based applications.
Python
2
star
24

eppi

Erlang based Python Package Index
Erlang
2
star
25

envirius.rs

envirius in Rust
Rust
2
star
26

ekalinin

Personal repo
1
star
27

enviriusx

Universal Virtual Environments Manager
Go
1
star
28

envirius.hs

Universal Virtual Environments Manager in Haskell
Haskell
1
star
29

sis

Simple Image Server
Go
1
star
30

lyseru

Python
1
star
31

cluedo-junior-logs

Logs for cluedo junior game
HTML
1
star
32

marktime.py

Python stopwatch module for humans.
Python
1
star
33

debianworld.ru

Makefile
1
star