Commit aab11178 authored by zeke's avatar zeke

go on a diet

parent cdad423b
#!/usr/bin/env bash #!/usr/bin/env bash
# bin/compile <build-dir> <cache-dir>
# fail fast set -e # fail fast
set -e # set -x # debug
# debug
# set -x
# clean up leaking environment
unset GIT_DIR
# config
SCONS_VERSION="1.2.0"
S3_BUCKET="heroku-buildpack-nodejs"
# parse and derive params
BUILD_DIR=$1 BUILD_DIR=$1
CACHE_DIR=$2 CACHE_DIR=$2
LP_DIR=`cd $(dirname $0); cd ..; pwd`
function error() {
echo " ! $*" >&2
exit 1
}
function mktmpdir() {
dir=$(mktemp -t node-$1-XXXX)
rm -rf $dir
mkdir -p $dir
echo $dir
}
function indent() {
c='s/^/ /'
case $(uname) in
Darwin) sed -l "$c";;
*) sed -u "$c";;
esac
}
function run_npm() { source support/helpers.sh
command="$1"
cd $BUILD_DIR # download latest stable version of node
HOME="$BUILD_DIR" $VENDORED_NODE/bin/node $VENDORED_NPM/cli.js $command 2>&1 | indent # detect desired node version in package.json using semver
if [ "${PIPESTATUS[*]}" != "0 0" ]; then
echo " ! Failed to $command dependencies with npm"
exit 1
fi
}
function manifest_versions() { # if !desired
curl "http://${S3_BUCKET}.s3.amazonaws.com/manifest.${1}" -s -o - | tr -s '\n' ' ' # (cached) ? cached : latest-stable
} # else
# (latest-stable satisfies desired) ? latest-stable : download
function resolve_version() { # if desired and cached are absent, use latest
available_versions="$1" # if desired is absent and cache is present, use cached
requested_version="$2" # if desired is ">" and differs from cached and latest-stable, download
default_version="$3" # if desired is specific and differs from cached and latest-stable, download
args="" semver.satisfies('0.10.15', '>=0.10.x')
for version in $available_versions; do args="${args} -v \"${version}\""; done
if [ "$2" == "" ]; then
args="${args} -r \"${default_version}\"";
else
args="${args} -r \"${requested_version}\"";
fi
evaluated_versions=$(eval $bootstrap_node/bin/node $LP_DIR/vendor/node-semver/bin/semver ${args} || echo "")
echo "$evaluated_versions" | tail -n 1
}
function package_engine_version() {
version=$(cat $BUILD_DIR/package.json | $bootstrap_node/bin/node $LP_DIR/vendor/json/json engines.$1 2>/dev/null)
if [ $? == 0 ]; then
echo $version | sed -e 's/\([<>=]\) /\1/g'
fi
}
function package_resolve_version() { package="http://s3pository.heroku.com/$engine-$version.tgz"
engine="$1" curl $package -s -o - | tar xzf - -C $location
resolved_version=$(resolve_version "${engine_versions[$engine]}" "${engine_requests[$engine]}" "${engine_defaults[$engine]}")
if [ "${resolved_version}" == "" ]; then
error "Requested engine $engine version ${engine_requests[$engine]} does not match available versions: ${engine_versions[$engine]}"
else
echo $resolved_version
fi
}
function package_download() {
engine="$1"
version="$2"
location="$3"
mkdir -p $location
package="http://${S3_BUCKET}.s3.amazonaws.com/$engine-$version.tgz"
curl $package -s -o - | tar xzf - -C $location
}
function cat_npm_debug_log() { function cat_npm_debug_log() {
if [ -f $BUILD_DIR/npm-debug.log ]; then if [ -f $BUILD_DIR/npm-debug.log ]; then
cat $BUILD_DIR/npm-debug.log cat $BUILD_DIR/npm-debug.log
fi fi
} }
trap cat_npm_debug_log EXIT trap cat_npm_debug_log EXIT
bootstrap_node=$(mktmpdir bootstrap_node)
package_download "nodejs" "0.4.7" $bootstrap_node
# make some associative arrays
declare -A engine_versions
declare -A engine_defaults
declare -A engine_requests
engine_defaults["node"]="0.10.x"
engine_defaults["npm"]="1.3.x"
engine_versions["node"]=$(manifest_versions "nodejs")
engine_requests["node"]=$(package_engine_version "node")
engine_versions["npm"]=$(manifest_versions "npm")
engine_requests["npm"]=$(package_engine_version "npm")
echo "-----> Resolving engine versions" echo "-----> Resolving engine versions"
# add a warning if no version of node specified
if [ "${engine_requests["node"]}" == "" ]; then
echo
echo "WARNING: No version of Node.js specified in package.json, see:" | indent
echo "https://devcenter.heroku.com/articles/nodejs-support#versions" | indent
echo
fi
NODE_VERSION=$(package_resolve_version "node") NODE_VERSION=$(package_resolve_version "node")
echo "Using Node.js version: ${NODE_VERSION}" | indent echo "Using node version: ${NODE_VERSION}" | indent
NPM_VERSION=$(package_resolve_version "npm")
echo "Using npm version: ${NPM_VERSION}" | indent
# cache directories
CACHE_STORE_DIR="$CACHE_DIR/node_modules/$NODE_VERSION/$NPM_VERSION"
CACHE_TARGET_DIR="$BUILD_DIR/node_modules"
# 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"
SCONS_PACKAGE="http://${S3_BUCKET}.s3.amazonaws.com/scons-${SCONS_VERSION}.tgz"
# vendor directories # vendor directories
VENDORED_NODE="$(mktmpdir node)" VENDORED_NODE="$(mktmpdir node)"
VENDORED_NPM="$(mktmpdir npm)" VENDORED_NPM="$(mktmpdir npm)"
VENDORED_SCONS="$(mktmpdir scons)" VENDORED_SCONS="$(mktmpdir scons)"
# download and unpack packages echo "-----> Fetching node binary"
echo "-----> Fetching Node.js binaries"
package_download "nodejs" "${NODE_VERSION}" "${VENDORED_NODE}"
package_download "npm" "${NPM_VERSION}" "${VENDORED_NPM}"
package_download "scons" "${SCONS_VERSION}" "${VENDORED_SCONS}"
# vendor node into the slug echo "-----> Vendoring node binary into slug"
PATH="$BUILD_DIR/bin:$PATH" PATH="$BUILD_DIR/bin:$PATH"
echo "-----> Vendoring node into slug"
mkdir -p "$BUILD_DIR/bin" mkdir -p "$BUILD_DIR/bin"
cp "$VENDORED_NODE/bin/node" "$BUILD_DIR/bin/node" cp "$VENDORED_NODE/bin/node" "$BUILD_DIR/bin/node"
...@@ -174,12 +58,7 @@ INCLUDE_PATH="$VENDORED_NODE/include" ...@@ -174,12 +58,7 @@ INCLUDE_PATH="$VENDORED_NODE/include"
export CPATH="$INCLUDE_PATH:$CPATH" export CPATH="$INCLUDE_PATH:$CPATH"
export CPPPATH="$INCLUDE_PATH:$CPPPATH" export CPPPATH="$INCLUDE_PATH:$CPPPATH"
# install dependencies with npm
echo "-----> Installing dependencies with npm" echo "-----> Installing dependencies with npm"
run_npm "install --production" run_npm "install --production"
run_npm "rebuild" run_npm "rebuild"
echo "Dependencies installed" | indent echo "Dependencies installed" | indent
echo "-----> Building runtime environment"
mkdir -p $BUILD_DIR/.profile.d
echo "export PATH=\"\$HOME/bin:\$HOME/node_modules/.bin:\$PATH\"" > $BUILD_DIR/.profile.d/nodejs.sh
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