Commit 3bdb6bfe authored by David Dollar's avatar David Dollar

allow usage of multiple nodejs versions

parent 2208d37e
#!/usr/bin/env bash
# bin/compile <build-dir> <cache-dir>
mktmpdir() {
# fail fast
set -e
function error() {
echo " ! $*"
exit 1
}
function mktmpdir() {
dir=$(mktemp -t node-$1-XXXX)
rm -rf $dir
mkdir -p $dir
......@@ -30,12 +38,19 @@ run_npm() {
unset GIT_DIR
function manifest_versions() {
curl "http://${S3_BUCKET}.s3.amazonaws.com/manifest.${1}" -s -o -
curl "http://${S3_BUCKET}.s3.amazonaws.com/manifest.${1}" -s -o - | tr -s '\n' ' '
}
function resolve_versions() {
args=""
for version in $1; do args="${args} -v \"${version}\""; done
for version in $2; do args="${args} -r \"${version}\""; done
eval vendor/node-semver/bin/semver ${args} | tail -r | head -n1
}
# config
NODE_VERSION="0.4.7"
NPM_VERSION="1.0.94"
DEFAULT_NODE_VERSION="0.4.7"
DEFAULT_NPM_VERSION="1.0.94"
SCONS_VERSION="1.2.0"
S3_BUCKET="heroku-buildpack-nodejs"
......@@ -46,6 +61,49 @@ LP_DIR=`cd $(dirname $0); cd ..; pwd`
CACHE_STORE_DIR="$CACHE_DIR/node_modules/$NPM_VERSION"
CACHE_TARGET_DIR="$BUILD_DIR/node_modules"
# determine available versions
NODEJS_VERSIONS=$(manifest_versions "nodejs")
NPM_VERSIONS=$(manifest_versions "npm")
# determine requested versions
engines=$(cat $BUILD_DIR/package.json | $LP_DIR/vendor/json/json engines 2>&1)
if [ $? == 0 ] && [ "$engines" != "" ]; then
REQUESTED_NODE_VERSION=$(cat $BUILD_DIR/package.json | $LP_DIR/vendor/json/json engines.node)
REQUESTED_NPM_VERSION=$(cat $BUILD_DIR/package.json | $LP_DIR/vendor/json/json engines.npm 2>&1)
else
REQUESTED_NODE_VERSION=""
REQUESTED_NPM_VERSION=""
fi
# resolve node version
if [ "${REQUESTED_NODE_VERSION}" == "" ]; then
NODE_VERSION=${DEFAULT_NODE_VERSION}
else
RESOLVED_NODE=$(resolve_versions "${NODEJS_VERSIONS}" "${REQUESTED_NODE_VERSION}")
if [ "${RESOLVED_NODE}" == "" ]; then
error "Requested Node.js version: ${REQUESTED_NODE_VERSION} does not match available versions: ${NODEJS_VERSIONS}"
else
NODE_VERSION=${RESOLVED_NODE}
fi
fi
echo "-----> Using Node.js version: ${NODE_VERSION}"
# resolve npm version
if [ "${REQUESTED_NPM_VERSION}" == "" ]; then
NPM_VERSION=${DEFAULT_NPM_VERSION}
else
RESOLVED_NPM=$(resolve_versions "${NPM_VERSIONS}" "${REQUESTED_NPM_VERSION}")
if [ "${RESOLVED_NPM}" == "" ]; then
error "Requested Node.js version: ${REQUESTED_NPM_VERSION} does not match available versions: ${NPMJS_VERSIONS}"
else
NPM_VERSION=${RESOLVED_NPM}
fi
fi
echo "-----> Using npm version: ${NPM_VERSION}"
# s3 packages
NODE_PACKAGE="http://${S3_BUCKET}.s3.amazonaws.com/nodejs-${NODE_VERSION}.tgz"
NPM_PACKAGE="http://${S3_BUCKET}.s3.amazonaws.com/npm-${NPM_VERSION}.tgz"
......@@ -56,9 +114,6 @@ VENDORED_NODE="$(mktmpdir node)"
VENDORED_NPM="$(mktmpdir npm)"
VENDORED_SCONS="$(mktmpdir scons)"
# determine node version
echo "available versions of node: $(manifest_versions "nodejs")"
# download and unpack packages
echo "-----> Fetching Node.js binaries"
mkdir -p $VENDORED_NODE && curl $NODE_PACKAGE -s -o - | tar xzf - -C $VENDORED_NODE
......@@ -67,7 +122,7 @@ mkdir -p $VENDORED_SCONS && curl $SCONS_PACKAGE -s -o - | tar xzf - -C $VENDORED
# vendor node into the slug
PATH="$BUILD_DIR/bin:$PATH"
echo "-----> Vendoring node $NODE_VERSION"
echo "-----> Vendoring node into slug"
mkdir -p "$BUILD_DIR/bin"
cp "$VENDORED_NODE/bin/node" "$BUILD_DIR/bin/node"
......@@ -100,11 +155,15 @@ if [ -d $CACHE_STORE_DIR ]; then
fi
# install dependencies with npm
echo "-----> Installing dependencies with npm $NPM_VERSION"
echo "-----> Installing dependencies with npm"
cd $BUILD_DIR
run_npm install
run_npm rebuild
HOME="$BUILD_DIR" $VENDORED_NODE/bin/node $VENDORED_NPM/cli.js prune 2>&1 | indent
HOME="$BUILD_DIR" $VENDORED_NODE/bin/node $VENDORED_NPM/cli.js install 2>&1 | indent
if [ "${PIPESTATUS[*]}" != "0 0" ]; then
error "Failed to install dependencies with npm"
else
echo " Dependencies installed"
fi
echo "Dependencies installed" | indent
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment