Giter Site home page Giter Site logo

envirius's Introduction

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) ➥  exitecho $$
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

envirius's People

Contributors

dehylton avatar ekalinin avatar em- avatar focusaurus avatar lowks avatar lucafavatella avatar macie avatar rolkar avatar theaidem avatar vincentbernat avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

envirius's Issues

[zsh] nv rm-cache does not work correctly

Shell used: zsh

Version of nv: 0.8.3

Command used: nv rm-cache --all

Output:

~/S/envirius_latest ❯❯❯ nv rm-cache --all                                master
nv_cmd_default:3: bad set of key/value pairs for associative array

Please avoid modifying the current user environment

Btw, very interesting project, great job! :D

I use a severly customized bash setup, and I already had troubles with nvm (see nvm-sh/nvm@42915fc) since by running in my interactive session it conflicted with some of my customizations.

Other thought the same about virtualenvwrapper and explained the problem far better than I ever could: Virtualenv's bin/activate is Doing It Wrong.

I'd strongly suggest to follow the approach taken by invewrapper by starting a new subshell, somewhat like chroot and others, as it's usually cleaner and more robust for the user and should greatly simplify your job too. :)

Thanks!

Support for zsh

In zsh 5.0.2 at minimum, nv shell init doesnt' work 100%:

/Users/offby1/.envirius/nv:109: command not found: complete

An init script that is zsh-friendly would be excellent.

Make it usable with OS X and zsh

This is a really good and useful application, It would be great to be able to use it with zsh.

Up to now my shell is flooded with errors. For example, if I try to install rust-prebuilt I get:

nv_cmd_default:unset:89: no such hash table element: plug_list_versions
nv_cmd_default:unset:90: no such hash table element: plug_url_for_download
nv_cmd_default:unset:91: no such hash table element: plug_check_deps
nv_cmd_default:unset:92: no such hash table element: plug_install
nv_cmd_default:unset:93: no such hash table element: plug_download
nv_cmd_default:unset:94: no such hash table element: plug_unpack
nv_cmd_default:unset:95: no such hash table element: plug_configure
nv_cmd_default:unset:96: no such hash table element: plug_build
nv_cmd_default:unset:97: no such hash table element: plug_build_env
nv_cmd_default:unset:98: no such hash table element: plug_post_install_actions
plug_install_default:63: bad option: -t
nv_cmd_default:170: no such file or directory: /Users/marcelloseri/.envirius/envs/rustlang/envirius.info

I have OS X 10.10.1 and zsh 5.0.7 (x86_64-apple-darwin14.0.0). I use zprezto.

I will try to investigate more as soon as I can

php environments

nv ls-versions --php

it doesn't parse php versions, how can i create env for this?

[zsh] activate-rust is missing

It can download now, but:

~/D/envirius-0.8.1 ❯❯❯ nv mk rust --rust-prebuilt=1.12.1
Creating environment: rust ...
 * installing rust-prebuilt==1.12.1 ...
plug_post_install_actions:6: no such file or directory: /home/lowks/.envirius/envs/rust/bin/activate-rust
plug_post_install_actions:7: no such file or directory: /home/lowks/.envirius/envs/rust/bin/activate-rust
plug_post_install_actions:8: no such file or directory: /home/lowks/.envirius/envs/rust/bin/activate-rust
plug_post_install_actions:9: no such file or directory: /home/lowks/.envirius/envs/rust/bin/activate-rust
chmod: cannot access '/home/lowks/.envirius/envs/rust/bin/activate-rust': No such file or directory
plug_post_install_actions:13: no such file or directory: /home/lowks/.envirius/envs/rust/bin/deactivate-rust
chmod: cannot access '/home/lowks/.envirius/envs/rust/bin/deactivate-rust': No such file or directory
nv_cmd_default:190: no such file or directory: /home/lowks/.envirius/envs/rust/envirius.info

The command that I am using:

nv mk rust --rust-prebuilt=1.12.1

Rust install does not work.

I think the rust url is wrong or outdated. The output is shown below:

~/P/p/golowkster ❯❯❯ nv ls-versions --rust-prebuilt                                                                fizzbuzz_example ⬆ ◼
* rust-prebuilt:
nightly-2016-10-27
~/P/p/golowkster ❯❯❯ nv rm rust                                                                                    fizzbuzz_example ⬆ ◼
Environment rust was deleted.
~/P/p/golowkster ❯❯❯ nv mk --rust=nightly-2016-10-27 rust                                                          fizzbuzz_example ⬆ ◼
Creating environment: rust ...
 * installing rust==nightly-2016-10-27 ...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   183  100   183    0     0    948      0 --:--:-- --:--:-- --:--:--   948
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
curl: (22) The requested URL returned error: 404 Not Found
envirius: failed to download 'http://static.rust-lang.org/dist/rust-nightly.tar.gz'
envirius: unable to fetch source file for rust==nightly-2016-10-27

Installation on Ubuntu successful but using failed

I am using:

  1. zsh
  2. Ubuntu

When I try to do nv mk elixir_latest it is successful, but then when I tro to activate it using nv activate elixir_latest I get the following:

~/S/envirius ❯❯❯ nv activate elixir_latest                                                                                                      master
complete:13: command not found: compdef
complete:13: command not found: compdef
Environment elixir_latest activated.

consider installing pre-built node binaries

Is there a compelling reason you are building from source? It's quite slow and entirely unnecessary for node since joyent distributes pre-build relocatable tar archives that can just be extracted and are immediately ready for use.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.