From 86744fef91ab55030c60f1fea68eaedf59773930 Mon Sep 17 00:00:00 2001 From: Jaka Hudoklin Date: Mon, 10 Nov 2014 16:59:00 +0100 Subject: [PATCH] nodePackages: fix builder - reuse unpack and patch phase - patch shebangs of source code - properly patch depdency versions (thanks @svanderburg) - add patching for github version names - add some inline docs - fix recursive depdencies runtime handling by copying files instead of symlinking if package has recursive dependencies --- .../web/nodejs/build-node-package.nix | 217 +++++++++++++----- pkgs/top-level/node-packages.nix | 11 +- 2 files changed, 159 insertions(+), 69 deletions(-) diff --git a/pkgs/development/web/nodejs/build-node-package.nix b/pkgs/development/web/nodejs/build-node-package.nix index 46067632410..8aae538c804 100644 --- a/pkgs/development/web/nodejs/build-node-package.nix +++ b/pkgs/development/web/nodejs/build-node-package.nix @@ -28,93 +28,188 @@ let }) (filter (nm: !(elem nm (args.passthru.names or []))) dep.names)) (peerDependencies)); self = let - # Pass resolved dependencies to dependencies of this package + # Pass resolved dependencies to dependencies of this package deps = map ( dep: dep.override { resolvedDeps = resolvedDeps // { "${name}" = self; }; } ) (attrValues requiredDeps); - in stdenv.mkDerivation ({ - unpackPhase = "true"; + patchShebangs = dir: '' + node=`type -p node` + coffee=`type -p coffee || true` + find -L ${dir} -type f -print0 | \ + xargs -0 sed --follow-symlinks -i \ + -e 's@#!/usr/bin/env node@#!'"$node"'@' \ + -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ + -e 's@#!/.*/node@#!'"$node"'@' \ + -e 's@#!/.*/coffee@#!'"$coffee"'@' || true + ''; + in stdenv.mkDerivation ({ inherit src; - + + postPatch = '' + ${patchShebangs "./"} + + # Some version specifiers (latest, unstable, URLs, file paths) force NPM + # to make remote connections or consult paths outside the Nix store. + # The following JavaScript replaces these by * to prevent that: + + ( + cat < node_modules/${name}/package.json < node_modules/${name}/package.json </dev/null || true + if [ -d "$out/lib/node_modules/.bin" ]; then + ln -sv $out/lib/node_modules/.bin $out/bin + ${patchShebangs "$out/lib/node_modules/.bin/*"} fi - '') args.passthru.names)} - ${concatStrings (mapAttrsToList (name: dep: '' - mv node_modules/${name} $out/lib/node_modules - '') peerDeps)} - mv node_modules/.bin $out/lib/node_modules 2>/dev/null || true - mv node_modules $out/.dependent-node-modules - if [ -d "$out/lib/node_modules/.bin" ]; then - ln -sv $out/lib/node_modules/.bin $out/bin - node=`type -p node` - coffee=`type -p coffee || true` - find -L $out/lib/node_modules/.bin/* -type f -print0 | \ - xargs -0 sed --follow-symlinks -i \ - -e 's@#!/usr/bin/env node@#!'"$node"'@' \ - -e 's@#!/usr/bin/env coffee@#!'"$coffee"'@' \ - -e 's@#!/.*/node@#!'"$node"'@' \ - -e 's@#!/.*/coffee@#!'"$coffee"'@' - fi + ) + runHook postInstall ''; @@ -141,6 +236,10 @@ let # Make buildNodePackage useful with --run-env nativeBuildInputs = (args.nativeBuildInputs or []) ++ deps ++ peerDependencies ++ neededNatives; + + # Expose list of recursive dependencies upstream, up to the package that + # caused recursive dependency + recursiveDeps = (flatten (map (d: remove name d.recursiveDeps) deps)) ++ (attrNames recursiveDeps); }); in self diff --git a/pkgs/top-level/node-packages.nix b/pkgs/top-level/node-packages.nix index 0aa26d34753..9127dfbbb43 100644 --- a/pkgs/top-level/node-packages.nix +++ b/pkgs/top-level/node-packages.nix @@ -14,16 +14,7 @@ rec { inherit (pkgs) runCommand; }; - patchSource = fn: srcAttrs: - let src = fn srcAttrs; in pkgs.runCommand src.name {} '' - mkdir unpack - cd unpack - unpackFile ${src} - chmod -R +w */ - mv */ package 2>/dev/null || true - sed -i -e "s/:\s*\"latest\"/: \"*\"/" -e "s/:\s\+\"[A-Za-z0-9_-]\+\/[A-Za-z0-9_-]\+\"/: \"*\"/" -e "s/:\s*\"\(https\?\|git\(\+\(ssh\|http\|https\)\)\?\):\/\/[^\"]*\"/: \"*\"/" package/package.json - mv */ $out - ''; + patchSource = fn: srcAttrs: fn srcAttrs; # Backwards compat patchLatest = patchSource fetchurl;