2010-04-16 00:13:33 +08:00
# Node Version Manager
# Implemented as a bash function
# To use source this file from your bash profile
#
# Implemented by Tim Caswell <tim@creationix.com>
# with much bash help from Matthew Ranney
2011-02-26 03:53:38 +08:00
# Auto detect the NVM_DIR
2011-01-26 00:29:49 +08:00
if [ ! -d " $NVM_DIR " ] ; then
2011-02-26 03:30:08 +08:00
export NVM_DIR = $( cd $( dirname ${ BASH_SOURCE [0] :- $0 } ) ; pwd )
2011-01-26 00:29:49 +08:00
fi
2010-12-11 03:32:16 +08:00
2011-01-23 04:07:27 +08:00
# Emulate curl with wget, if necessary
if [ ! ` which curl` ] ; then
if [ ` which wget` ] ; then
curl( ) {
ARGS = " $* "
ARGS = ${ ARGS /-s /-q }
2011-08-25 12:32:47 +08:00
ARGS = ${ ARGS /--progress-bar / }
2011-01-23 04:07:27 +08:00
ARGS = ${ ARGS /-C - /-c }
ARGS = ${ ARGS /-o /-O }
wget $ARGS
}
else
NOCURL = 'nocurl'
curl( ) { echo 'Need curl or wget to proceed.' >& 2; }
fi
fi
2011-01-23 00:48:57 +08:00
# Expand a version using the version cache
2011-01-23 03:54:15 +08:00
nvm_version( )
2011-01-23 00:48:57 +08:00
{
PATTERN = $1
VERSION = ''
2011-01-23 02:12:13 +08:00
if [ -f " $NVM_DIR /alias/ $PATTERN " ] ; then
2011-01-23 03:54:15 +08:00
nvm_version ` cat $NVM_DIR /alias/$PATTERN `
2011-01-23 02:12:13 +08:00
return
fi
2011-01-23 00:48:57 +08:00
# If it looks like an explicit version, don't do anything funny
2011-01-23 02:12:13 +08:00
if [ [ " $PATTERN " = = v*.*.* ] ] ; then
VERSION = " $PATTERN "
2011-01-23 00:48:57 +08:00
fi
# The default version is the current one
2011-01-23 02:12:13 +08:00
if [ ! " $PATTERN " -o " $PATTERN " = 'current' ] ; then
2011-01-23 00:48:57 +08:00
VERSION = ` node -v 2>/dev/null`
fi
2011-01-23 02:12:13 +08:00
if [ " $PATTERN " = 'stable' ] ; then
2011-01-23 00:48:57 +08:00
PATTERN = '*.*[02468].'
fi
2011-01-23 02:12:13 +08:00
if [ " $PATTERN " = 'latest' ] ; then
2011-01-23 00:48:57 +08:00
PATTERN = '*.*.'
fi
2011-01-23 02:12:13 +08:00
if [ " $PATTERN " = 'all' ] ; then
2011-04-10 05:47:50 +08:00
( cd $NVM_DIR ; \l s -dG v* 2>/dev/null || echo "N/A" )
2011-01-23 00:48:57 +08:00
return
fi
if [ ! " $VERSION " ] ; then
2011-08-25 12:03:13 +08:00
VERSION = ` ( cd $NVM_DIR ; \l s -d v${ ~PATTERN } * 2>/dev/null) | sort -t. -k 2,1n -k 2,2n -k 3,3n | tail -n1`
2011-01-23 00:48:57 +08:00
fi
if [ ! " $VERSION " ] ; then
echo "N/A"
2011-01-29 23:24:42 +08:00
return 13
2011-01-23 00:48:57 +08:00
elif [ -e " $NVM_DIR / $VERSION " ] ; then
2011-04-10 05:47:50 +08:00
( cd $NVM_DIR ; \l s -dG " $VERSION " )
2011-01-23 00:48:57 +08:00
else
echo " $VERSION "
fi
}
2010-04-16 00:13:33 +08:00
nvm( )
{
2010-04-16 00:20:27 +08:00
if [ $# -lt 1 ] ; then
nvm help
return
fi
case $1 in
"help" )
echo
echo "Node Version Manager"
2010-04-16 00:53:39 +08:00
echo
2010-04-16 00:20:27 +08:00
echo "Usage:"
2011-01-23 02:12:13 +08:00
echo " nvm help Show this message"
echo " nvm install <version> Download and install a <version>"
2011-08-20 09:00:25 +08:00
echo " nvm uninstall <version> Uninstall a version"
2011-01-23 02:12:13 +08:00
echo " nvm use <version> Modify PATH to use <version>"
echo " nvm ls List versions (installed versions are blue)"
echo " nvm ls <version> List versions matching a given description"
echo " nvm deactivate Undo effects of NVM on current shell"
echo " nvm sync Update the local cache of available versions"
echo " nvm alias [<pattern>] Show all aliases beginning with <pattern>"
echo " nvm alias <name> <version> Set an alias named <name> pointing to <version>"
2011-08-20 09:00:25 +08:00
echo " nvm unalias <name> Deletes the alias named <name>"
2011-07-03 00:14:48 +08:00
echo " nvm copy-packages <version> Install global NPM packages contained in <version> to current version"
2010-04-16 00:53:39 +08:00
echo
echo "Example:"
2011-02-26 03:30:08 +08:00
echo " nvm install v0.4.0 Install a specific version number"
2011-01-23 02:12:13 +08:00
echo " nvm use stable Use the stable release"
echo " nvm install latest Install the latest, possibly unstable version"
2011-02-26 03:30:08 +08:00
echo " nvm use 0.2 Use the latest available 0.2.x release"
2011-08-20 09:00:25 +08:00
echo " nvm alias default v0.4.0 Set v0.4.0 as the default"
2010-04-16 00:20:27 +08:00
echo
; ;
"install" )
2010-04-16 00:53:39 +08:00
if [ $# -ne 2 ] ; then
2010-04-16 00:20:27 +08:00
nvm help
2011-01-29 23:24:42 +08:00
return
2010-04-16 00:20:27 +08:00
fi
2011-01-23 04:07:27 +08:00
[ " $NOCURL " ] && curl && return
2011-01-23 03:54:15 +08:00
VERSION = ` nvm_version $2 `
2011-07-28 13:31:35 +08:00
tarball = ''
2011-07-28 05:50:41 +08:00
if [ "`curl -Is " http://nodejs.org/dist/$VERSION /node-$VERSION .tar.gz" | grep '200 OK'`" != '' ] ; then
2011-07-28 13:31:35 +08:00
tarball = " http://nodejs.org/dist/ $VERSION /node- $VERSION .tar.gz "
2011-07-28 05:50:41 +08:00
elif [ "`curl -Is " http://nodejs.org/dist/node-$VERSION .tar.gz" | grep '200 OK'`" != '' ] ; then
2011-07-28 13:31:35 +08:00
tarball = " http://nodejs.org/dist/node- $VERSION .tar.gz "
2011-07-28 05:50:41 +08:00
fi
2011-02-14 13:06:13 +08:00
if (
2011-07-28 05:50:41 +08:00
[ ! -z $tarball ] && \
2011-02-26 03:30:08 +08:00
mkdir -p " $NVM_DIR /src " && \
2011-02-14 13:06:13 +08:00
cd " $NVM_DIR /src " && \
2011-08-25 12:03:13 +08:00
curl -C - --progress-bar $tarball -o " node- $VERSION .tar.gz " && \
2011-02-26 03:30:08 +08:00
tar -xzf " node- $VERSION .tar.gz " && \
cd " node- $VERSION " && \
./configure --prefix= " $NVM_DIR / $VERSION " && \
2011-02-14 13:06:13 +08:00
make && \
2011-02-26 03:30:08 +08:00
rm -f " $NVM_DIR / $VERSION " 2>/dev/null && \
2011-02-14 13:06:13 +08:00
make install
)
then
2011-02-26 03:30:08 +08:00
nvm use $VERSION
2011-02-14 13:06:13 +08:00
if ! which npm ; then
echo "Installing npm..."
2011-05-06 04:51:08 +08:00
# TODO: if node version 0.2.x add npm_install=0.2.19 before sh
curl http://npmjs.org/install.sh | clean = yes sh
2011-02-14 13:06:13 +08:00
fi
else
2011-02-26 03:30:08 +08:00
echo " nvm: install $VERSION failed! "
2010-12-11 04:43:27 +08:00
fi
2010-04-16 00:20:27 +08:00
; ;
2011-08-20 09:00:25 +08:00
"uninstall" )
[ $# -ne 2 ] && nvm help && return
if [ [ $2 = = ` nvm_version` ] ] ; then
echo " nvm: Cannot uninstall currently-active node version, $2 . "
return
fi
VERSION = ` nvm_version $2 `
if [ ! -d $NVM_DIR /$VERSION ] ; then
echo " $VERSION version is not installed yet "
return ;
fi
# Delete all files related to target version.
( cd " $NVM_DIR " && \
rm -rf " node- $VERSION " 2>/dev/null && \
mkdir -p " $NVM_DIR /src " && \
cd " $NVM_DIR /src " && \
rm -f " node- $VERSION .tar.gz " 2>/dev/null && \
rm -rf " $NVM_DIR / $VERSION " 2>/dev/null)
echo " Uninstalled node $VERSION "
# Rm any aliases that point to uninstalled version.
for A in ` grep -l $VERSION $NVM_DIR /alias/*`
do
nvm unalias ` basename $A `
done
# Run sync in order to restore version stub file in $NVM_DIR.
nvm sync 1>/dev/null
; ;
2010-04-21 07:51:07 +08:00
"deactivate" )
if [ [ $PATH = = *$NVM_DIR /*/bin* ] ] ; then
export PATH = ${ PATH % $NVM_DIR /*/bin* } ${ PATH #* $NVM_DIR /*/bin : }
2011-05-06 04:51:08 +08:00
hash -r
2010-04-21 07:51:07 +08:00
echo " $NVM_DIR /*/bin removed from \$PATH "
else
echo " Could not find $NVM_DIR /*/bin in \$PATH "
fi
2010-12-12 12:19:23 +08:00
if [ [ $MANPATH = = *$NVM_DIR /*/share/man* ] ] ; then
export MANPATH = ${ MANPATH % $NVM_DIR /*/share/man* } ${ MANPATH #* $NVM_DIR /*/share/man : }
echo " $NVM_DIR /*/share/man removed from \$MANPATH "
else
echo " Could not find $NVM_DIR /*/share/man in \$MANPATH "
fi
2010-04-27 01:40:35 +08:00
; ;
2010-04-16 00:20:27 +08:00
"use" )
2010-04-16 00:53:39 +08:00
if [ $# -ne 2 ] ; then
2010-12-11 03:32:16 +08:00
nvm help
return
2010-04-16 00:20:27 +08:00
fi
2011-01-23 03:54:15 +08:00
VERSION = ` nvm_version $2 `
2011-01-23 00:57:08 +08:00
if [ ! -d $NVM_DIR /$VERSION ] ; then
echo " $VERSION version is not installed yet "
2010-04-19 23:46:58 +08:00
return ;
fi
2010-04-19 23:22:28 +08:00
if [ [ $PATH = = *$NVM_DIR /*/bin* ] ] ; then
2011-01-23 00:57:08 +08:00
PATH = ${ PATH % $NVM_DIR /*/bin* } $NVM_DIR /$VERSION /bin${ PATH #* $NVM_DIR /*/bin }
2010-04-19 23:22:28 +08:00
else
2011-01-23 00:57:08 +08:00
PATH = " $NVM_DIR / $VERSION /bin: $PATH "
2010-04-19 23:22:28 +08:00
fi
2010-12-12 12:19:23 +08:00
if [ [ $MANPATH = = *$NVM_DIR /*/share/man* ] ] ; then
2011-01-23 00:57:08 +08:00
MANPATH = ${ MANPATH % $NVM_DIR /*/share/man* } $NVM_DIR /$VERSION /share/man${ MANPATH #* $NVM_DIR /*/share/man }
2010-12-12 12:19:23 +08:00
else
2011-01-23 00:57:08 +08:00
MANPATH = " $NVM_DIR / $VERSION /share/man: $MANPATH "
2010-12-12 12:19:23 +08:00
fi
2010-04-19 23:22:28 +08:00
export PATH
2011-05-06 04:51:08 +08:00
hash -r
2010-12-12 12:19:23 +08:00
export MANPATH
2011-01-23 00:57:08 +08:00
export NVM_PATH = " $NVM_DIR / $VERSION /lib/node "
export NVM_BIN = " $NVM_DIR / $VERSION /bin "
echo " Now using node $VERSION "
2010-04-16 00:20:27 +08:00
; ;
2010-12-11 03:32:16 +08:00
"ls" )
2010-04-16 00:53:39 +08:00
if [ $# -ne 1 ] ; then
2011-01-23 03:54:15 +08:00
nvm_version $2
2011-01-23 02:12:13 +08:00
return
2010-04-16 00:53:39 +08:00
fi
2011-01-23 03:54:15 +08:00
nvm_version all
2011-01-23 00:48:57 +08:00
for P in { stable,latest,current} ; do
2011-01-23 03:54:15 +08:00
echo -ne " $P : \t " ; nvm_version $P
2010-04-19 23:46:58 +08:00
done
2011-01-23 02:12:13 +08:00
nvm alias
2011-01-23 00:48:57 +08:00
echo "# use 'nvm sync' to update from nodejs.org"
; ;
2011-01-23 02:12:13 +08:00
"alias" )
2011-01-26 00:12:13 +08:00
mkdir -p $NVM_DIR /alias
2011-01-23 02:12:13 +08:00
if [ $# -le 2 ] ; then
2011-04-10 05:47:50 +08:00
( cd $NVM_DIR /alias && for ALIAS in ` \l s $2 * 2>/dev/null` ; do
2011-01-23 02:12:13 +08:00
DEST = ` cat $ALIAS `
2011-01-23 03:54:15 +08:00
VERSION = ` nvm_version $DEST `
2011-01-23 02:12:13 +08:00
if [ " $DEST " = " $VERSION " ] ; then
echo " $ALIAS -> $DEST "
else
echo " $ALIAS -> $DEST (-> $VERSION ) "
fi
done )
return
fi
if [ ! " $3 " ] ; then
rm -f $NVM_DIR /alias/$2
echo " $2 -> *poof* "
return
fi
mkdir -p $NVM_DIR /alias
2011-01-23 03:54:15 +08:00
VERSION = ` nvm_version $3 `
2011-01-23 02:12:13 +08:00
if [ $? -ne 0 ] ; then
2011-08-20 09:00:25 +08:00
echo " ! WARNING: Version ' $3 ' does not exist. " >& 2
2011-01-23 02:12:13 +08:00
fi
echo $3 > " $NVM_DIR /alias/ $2 "
if [ ! " $3 " = " $VERSION " ] ; then
echo " $2 -> $3 (-> $VERSION ) "
echo "! WARNING: Moving target. Aliases to implicit versions may change without warning."
else
echo " $2 -> $3 "
fi
; ;
2011-08-20 09:00:25 +08:00
"unalias" )
mkdir -p $NVM_DIR /alias
[ $# -ne 2 ] && nvm help && return
[ ! -f $NVM_DIR /alias/$2 ] && echo " Alias $2 doesn't exist! " && return
rm -f $NVM_DIR /alias/$2
echo " Deleted alias $2 "
; ;
2011-01-23 00:48:57 +08:00
"sync" )
2011-01-23 04:52:27 +08:00
[ " $NOCURL " ] && curl && return
2011-01-23 03:54:15 +08:00
LATEST = ` nvm_version latest`
STABLE = ` nvm_version stable`
2011-01-23 00:48:57 +08:00
( cd $NVM_DIR
rm -f v* 2>/dev/null
2011-01-25 00:11:46 +08:00
printf "# syncing with nodejs.org..."
2011-07-28 05:50:41 +08:00
for VER in ` curl -s http://nodejs.org/dist/ -o - | grep 'v[0-9].*' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//' -e 's/<[^>]*>//' -e 's/\/<[^>]*>.*//' ` ; do
2011-01-23 02:31:20 +08:00
touch $VER
2011-01-23 00:48:57 +08:00
done
echo " done."
)
2011-01-23 03:54:15 +08:00
[ " $STABLE " = ` nvm_version stable` ] || echo "NEW stable: `nvm_version stable`"
[ " $LATEST " = ` nvm_version latest` ] || echo "NEW latest: `nvm_version latest`"
2011-01-23 00:48:57 +08:00
; ;
2011-07-03 00:14:48 +08:00
"copy-packages" )
if [ $# -ne 2 ] ; then
nvm help
return
fi
VERSION = ` nvm_version $2 `
ROOT = ` nvm use $VERSION && npm -g root`
INSTALLS = ` nvm use $VERSION > /dev/null && npm -g -p ll | grep " $ROOT \/[^/]\+ $" | cut -d '/' -f 8 | cut -d ":" -f 2 | grep -v npm | tr "\n" " " `
npm install -g $INSTALLS
; ;
2011-01-23 00:48:57 +08:00
"clear-cache" )
2011-01-25 00:11:46 +08:00
rm -f $NVM_DIR /v* 2>/dev/null
2011-01-23 00:48:57 +08:00
echo "Cache cleared."
; ;
"version" )
2011-01-23 03:54:15 +08:00
nvm_version $2
2010-04-16 00:20:27 +08:00
; ;
* )
nvm help
; ;
esac
2010-12-11 03:32:16 +08:00
}
2011-01-23 02:16:24 +08:00
nvm ls default >/dev/null 2>& 1 && nvm use default >/dev/null