Skip to content

Instantly share code, notes, and snippets.

@bobvanderlinden
Created June 3, 2016 18:12
Show Gist options
  • Save bobvanderlinden/4d02b7fdc6f3c52eda188f95667e3915 to your computer and use it in GitHub Desktop.
Save bobvanderlinden/4d02b7fdc6f3c52eda188f95667e3915 to your computer and use it in GitHub Desktop.
Nix and npm-shrinkwrap
source $stdenv/setup
# Place npm-shrinkwrap.json alongside package.json
ln -s $NPM_SHRINKWRAP ./npm-shrinkwrap.json
# Create fake package.json. This is not used by npm when npm-shrinkwrap.json is available, but npm does parse this as json
echo "{}" > package.json
# Create fake HOME directory for npm
export HOME=$PWD/home
mkdir -p $HOME
npm install
for package in node_modules/**/package.json
do
node $clean_package_js $package
done
cp -r node_modules $out
{stdenv, writeScript, git, nodejs, cacert}:
{ name, shrinkwrap, sha256 }:
stdenv.mkDerivation {
inherit name;
builder = ./builder.sh;
buildInputs = [ git nodejs ];
outputHashAlgo = "sha256";
outputHashMode = "recursive";
outputHash = sha256;
GIT_SSL_CAINFO = "${cacert}/etc/ssl/certs/ca-bundle.crt";
NPM_SHRINKWRAP = shrinkwrap;
clean_package_js = writeScript "clean-package.js" ''
var fs = require('fs');
var filePath = process.argv[2];
console.log("Cleaning up", filePath);
var fileContents = fs.readFileSync(filePath);
var packageContents = JSON.parse(fileContents);
delete packageContents._shasum;
delete packageContents._from;
fileContents = JSON.stringify(packageContents);
fs.writeFileSync(filePath, fileContents);
'';
preferLocalBuild = true;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment