diff --git a/README.markdown b/README.markdown index 44474fd..a85482f 100644 --- a/README.markdown +++ b/README.markdown @@ -4,7 +4,22 @@ First you'll need to make sure your system has a c++ compiler. For OSX, XCode will work, for Ubuntu, the build-essential and libssl-dev packages work. -To install create a folder somewhere in your filesystem with the "`nvm.sh`" file inside it. I put mine in a folder called "`nvm`". +### Install script + +To install you could use the [install script](https://github.com/creationix/nvm/blob/master/install.sh) (requires Git) using cURL: + + curl https://raw.github.com/creationix/nvm/master/install.sh | sh + +or Wget: + + wget -qO- https://raw.github.com/creationix/nvm/master/install.sh | sh + +The script clones the Nvm repository to `~/.nvm` and adds the source line to your profile (`~/.bash_profile` or `~/.profile`). + + +### Manual install + +For manual install create a folder somewhere in your filesystem with the `nvm.sh` file inside it. I put mine in a folder called `nvm`. Or if you have `git` installed, then just clone it: @@ -14,35 +29,38 @@ To activate nvm, you need to source it from your bash shell . ~/nvm/nvm.sh -I always add this line to my ~/.bashrc or ~/.profile file to have it automatically sources upon login. +I always add this line to my `~/.bashrc` or `~/.profile` file to have it automatically sourced upon login. Often I also put in a line to use a specific version of node. ## Usage -To download, compile, and install the v0.6.14 release of node, do this: - - nvm install 0.6.14 +To download, compile, and install the latest v0.8.x release of node, do this: + nvm install 0.8 And then in any new shell just use the installed version: - nvm use 0.6.14 + nvm use 0.8 Or you can just run it: - nvm run 0.6.14 + nvm run 0.8 -If you want to see what versions are available: +If you want to see what versions are installed: nvm ls +If you want to see what versions are available to install: + + nvm ls-remote + To restore your PATH, you can deactivate it. nvm deactivate To set a default Node version to be used in any new shell, use the alias 'default': - nvm alias default 0.6 + nvm alias default 0.8 ## License @@ -130,3 +148,6 @@ on Arch Linux and other systems using python3 by default, before running *instal export PYTHON=python2 +After the v0.8.6 release of node, nvm tries to install from binary packages. But in some systems, the official binary packages don't work due to incompatibility of shared libs. In such cases, use `-s` option to force install from source: + + nvm install -s 0.8.6 diff --git a/bash_completion b/bash_completion index 85b9eca..b3d4c25 100644 --- a/bash_completion +++ b/bash_completion @@ -79,4 +79,11 @@ __nvm () return 0 } +# complete is a bash builtin, but recent versions of ZSH come with a function +# called bashcompinit that will create a complete in ZSH. If the user is in +# ZSH, load and run bashcompinit before calling the complete function. +if [[ -n ${ZSH_VERSION-} ]]; then + autoload -U +X bashcompinit && bashcompinit +fi + complete -o default -o nospace -F __nvm nvm diff --git a/install.sh b/install.sh index ccdd0cb..234716f 100755 --- a/install.sh +++ b/install.sh @@ -25,7 +25,7 @@ else fi fi -SOURCE_STR='[[ -s "$HOME/.nvm/nvm.sh" ]] && . "$HOME/.nvm/nvm.sh" # This loads NVM' +SOURCE_STR="[[ -s "$NVM_TARGET/nvm.sh" ]] && . "$NVM_TARGET/nvm.sh" # This loads NVM" if [ -z "$PROFILE" ] || [ ! -f "$PROFILE" ] ; then if [ -z $PROFILE ]; then diff --git a/nvm.sh b/nvm.sh index 25caa34..05aeaaf 100755 --- a/nvm.sh +++ b/nvm.sh @@ -16,6 +16,14 @@ if [ ! -z "$(which unsetopt 2>/dev/null)" ]; then unsetopt nomatch 2>/dev/null fi +# Obtain nvm version from rc file +function rc_nvm_version { + if [ -e .nvmrc ]; then + RC_VERSION=`cat .nvmrc | head -n 1` + echo "Found .nvmrc files with version <$RC_VERSION>" + fi +} + # Expand a version using the version cache nvm_version() { @@ -74,6 +82,7 @@ nvm_ls() nvm_ls_remote() { local PATTERN=$1 + local VERSIONS if [ "$PATTERN" ]; then if echo "${PATTERN}" | grep -v '^v' ; then PATTERN=v$PATTERN @@ -81,7 +90,7 @@ nvm_ls_remote() else PATTERN=".*" fi - local VERSIONS=`curl -s http://nodejs.org/dist/ \ + VERSIONS=`curl -s http://nodejs.org/dist/ \ | egrep -o 'v[0-9]+\.[0-9]+\.[0-9]+' \ | grep -w "${PATTERN}" \ | sort -t. -u -k 1.2,1n -k 2,2n -k 3,3n` @@ -150,7 +159,7 @@ nvm() echo echo "Usage:" echo " nvm help Show this message" - echo " nvm install Download and install a " + echo " nvm install [-s] Download and install a " echo " nvm uninstall Uninstall a version" echo " nvm use Modify PATH to use " echo " nvm run [] Run with as arguments" @@ -178,19 +187,35 @@ nvm() local url local sum local tarball + local shasum='shasum' + local nobinary if [ ! `which curl` ]; then echo 'NVM Needs curl to proceed.' >&2; fi + if [ -z "`which shasum`" ]; then + shasum='sha1sum' + fi + if [ $# -lt 2 ]; then nvm help return fi - VERSION=`nvm_remote_version $2` + + shift + + nobinary=0 + if [ "$1" = "-s" ]; then + nobinary=1 + shift + fi + + VERSION=`nvm_remote_version $1` ADDITIONAL_PARAMETERS='' + shift - shift + while [ $# -ne 0 ] do ADDITIONAL_PARAMETERS="$ADDITIONAL_PARAMETERS $1" @@ -199,34 +224,37 @@ nvm() [ -d "$NVM_DIR/$VERSION" ] && echo "$VERSION is already installed." && return - # shortcut - try the binary if possible. - if [ -n "$os" ]; then - binavail= - # binaries started with node 0.8.6 - case "$VERSION" in - v0.8.[012345]) binavail=0 ;; - v0.[1234567]) binavail=0 ;; - *) binavail=1 ;; - esac - if [ $binavail -eq 1 ]; then - t="$VERSION-$os-$arch" - url="http://nodejs.org/dist/$VERSION/node-${t}.tar.gz" - sum=`curl -s http://nodejs.org/dist/$VERSION/SHASUMS.txt.asc | grep node-${t}.tar.gz | awk '{print $1}'` - if ( - mkdir -p "$NVM_DIR/tmp/node-${t}" && \ - cd "$NVM_DIR/tmp" && \ - curl -C - --progress-bar $url -o "node-${t}.tar.gz" && \ - nvm_checksum `shasum node-${t}.tar.gz | awk '{print $1}'` $sum && \ - tar -xzf "node-${t}.tar.gz" -C "node-${t}" --strip-components 1 && \ - mv "node-${t}" "../$VERSION" && \ - rm -f "node-${t}.tar.gz" - ) - then - nvm use $VERSION - return; - else - echo "Binary download failed, trying source." >&2 - cd "$NVM_DIR/tmp" && rm -rf "node-${t}.tar.gz" "node-${t}" + # skip binary install if no binary option specified. + if [ $nobinary -ne 1 ]; then + # shortcut - try the binary if possible. + if [ -n "$os" ]; then + binavail= + # binaries started with node 0.8.6 + case "$VERSION" in + v0.8.[012345]) binavail=0 ;; + v0.[1234567].*) binavail=0 ;; + *) binavail=1 ;; + esac + if [ $binavail -eq 1 ]; then + t="$VERSION-$os-$arch" + url="http://nodejs.org/dist/$VERSION/node-${t}.tar.gz" + sum=`curl -s http://nodejs.org/dist/$VERSION/SHASUMS.txt | grep node-${t}.tar.gz | awk '{print $1}'` + if ( + mkdir -p "$NVM_DIR/tmp/node-${t}" && \ + cd "$NVM_DIR/tmp" && \ + curl -C - --progress-bar $url -o "node-${t}.tar.gz" && \ + nvm_checksum `${shasum} node-${t}.tar.gz | awk '{print $1}'` $sum && \ + tar -xzf "node-${t}.tar.gz" -C "node-${t}" --strip-components 1 && \ + mv "node-${t}" "../$VERSION" && \ + rm -f "node-${t}.tar.gz" + ) + then + nvm use $VERSION + return; + else + echo "Binary download failed, trying source." >&2 + cd "$NVM_DIR/tmp" && rm -rf "node-${t}.tar.gz" "node-${t}" + fi fi fi fi @@ -246,7 +274,7 @@ nvm() mkdir -p "$NVM_DIR/src" && \ cd "$NVM_DIR/src" && \ curl --progress-bar $tarball -o "node-$VERSION.tar.gz" && \ - if [ "$sum" = "" ]; then : ; else nvm_checksum `shasum node-$VERSION.tar.gz | awk '{print $1}'` $sum; fi && \ + if [ "$sum" = "" ]; then : ; else nvm_checksum `${shasum} node-$VERSION.tar.gz | awk '{print $1}'` $sum; fi && \ tar -xzf "node-$VERSION.tar.gz" && \ cd "node-$VERSION" && \ ./configure --prefix="$NVM_DIR/$VERSION" $ADDITIONAL_PARAMETERS && \ @@ -324,14 +352,26 @@ nvm() fi ;; "use" ) - if [ $# -ne 2 ]; then + if [ $# -eq 0 ]; then + nvm help + return + fi + if [ $# -eq 1 ]; then + rc_nvm_version + if [ ! -z $RC_VERSION ]; then + VERSION=`nvm_version $RC_VERSION` + fi + else + VERSION=`nvm_version $2` + fi + if [ -z $VERSION ]; then nvm help return fi VERSION=`nvm_version $2` if [ ! -d $NVM_DIR/$VERSION ]; then echo "$VERSION version is not installed yet" - return; + return 1 fi if [[ $PATH == *$NVM_DIR/*/bin* ]]; then PATH=${PATH%$NVM_DIR/*/bin*}$NVM_DIR/$VERSION/bin${PATH#*$NVM_DIR/*/bin} diff --git a/test/slow/install from binary b/test/slow/install from binary new file mode 100755 index 0000000..c22e0d8 --- /dev/null +++ b/test/slow/install from binary @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e +. ../../nvm.sh + +# Remove the stuff we're clobbering. +[ -e ../../v0.8.6 ] && rm -R ../../v0.8.6 + +# Install from binary +nvm install 0.8.6 + +# Check +[ -d ../../v0.8.6 ] +nvm run v0.8.6 --version | grep v0.8.6 diff --git a/test/slow/install from source b/test/slow/install from source new file mode 100755 index 0000000..d124b27 --- /dev/null +++ b/test/slow/install from source @@ -0,0 +1,14 @@ +#!/bin/sh + +set -e +. ../../nvm.sh + +# Remove the stuff we're clobbering. +[ -e ../../v0.8.6 ] && rm -R ../../v0.8.6 + +# Install from source +nvm install -s 0.8.6 + +# Check +[ -d ../../v0.8.6 ] +nvm run v0.8.6 --version | grep v0.8.6