diff options
author | Jaka Hudoklin <jakahudoklin@gmail.com> | 2015-01-24 22:54:03 +0100 |
---|---|---|
committer | Jaka Hudoklin <jakahudoklin@gmail.com> | 2015-01-24 23:28:41 +0100 |
commit | 628c84c831b6a66cb286e8a82012a31a44ff10b8 (patch) | |
tree | d4e4e5edab068e5bdb47916350731fc6e6929114 /pkgs/development/web | |
parent | a00131bb321fe589a0d06756046b233e97bc0329 (diff) | |
download | nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar.gz nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar.bz2 nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar.lz nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar.xz nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.tar.zst nixlib-628c84c831b6a66cb286e8a82012a31a44ff10b8.zip |
nodePackages: refactor, add support for overrides
Diffstat (limited to 'pkgs/development/web')
-rw-r--r-- | pkgs/development/web/nodejs/build-node-package.nix | 114 |
1 files changed, 70 insertions, 44 deletions
diff --git a/pkgs/development/web/nodejs/build-node-package.nix b/pkgs/development/web/nodejs/build-node-package.nix index a76d45e52740..729ee8b93650 100644 --- a/pkgs/development/web/nodejs/build-node-package.nix +++ b/pkgs/development/web/nodejs/build-node-package.nix @@ -1,6 +1,32 @@ { stdenv, runCommand, nodejs, neededNatives}: -args @ { name, src, deps ? {}, peerDependencies ? [], flags ? [], preShellHook ? "", postShellHook ? "", resolvedDeps ? {}, bin ? null, ... }: +{ + name, src, + + # List or attribute set of dependencies + deps ? {}, + + # List or attribute set of peer depencies + peerDependencies ? [], + + # Whether package is binary or library + bin ? null, + + # Flags passed to npm install + flags ? [], + + # Command to be run before shell hook + preShellHook ? "", + + # Command to be run after shell hook + postShellHook ? "", + + # Attribute set of already resolved deps (internal), + # for avoiding infinite recursion + resolvedDeps ? {}, + + ... +} @ args: with stdenv.lib; @@ -12,6 +38,9 @@ let mv *node* $out ''; + # Package name without version + pkgName = (builtins.parseDrvName name).name; + # Convert deps to attribute set attrDeps = if isAttrs deps then deps else (listToAttrs (map (dep: nameValuePair dep.name dep) deps)); @@ -22,10 +51,7 @@ let # Recursive dependencies that we want to avoid with shim creation recursiveDeps = removeAttrs attrDeps (attrNames requiredDeps); - peerDeps = listToAttrs (concatMap (dep: map (name: { - inherit name; - value = dep; - }) (filter (nm: !(elem nm (args.passthru.names or []))) dep.names)) (peerDependencies)); + peerDeps = filter (dep: dep.pkgName != pkgName) peerDependencies; self = let # Pass resolved dependencies to dependencies of this package @@ -121,29 +147,29 @@ let # Symlink or copy dependencies for node modules # copy is needed if dependency has recursive dependencies, # because node can't follow symlinks while resolving recursive deps. - ${concatStrings (concatMap (dep: map (name: + ${concatMapStrings (dep: if dep.recursiveDeps == [] then '' - ln -sv ${dep}/lib/node_modules/${name} node_modules/ + ln -sv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ '' else '' - cp -R ${dep}/lib/node_modules/${name} node_modules/ + cp -R ${dep}/lib/node_modules/${dep.pkgName} node_modules/ '' - ) dep.names) deps)} + ) deps} # Symlink peer dependencies - ${concatStrings (mapAttrsToList (name: dep: '' - ln -sv ${dep}/lib/node_modules/${name} node_modules/ - '') peerDeps)} + ${concatMapStrings (dep: '' + ln -sv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ + '') peerDeps} # Create shims for recursive dependenceies - ${concatStrings (concatMap (dep: map (name: '' - mkdir -p node_modules/${name} - cat > node_modules/${name}/package.json <<EOF + ${concatMapStrings (dep: '' + mkdir -p node_modules/${dep.pkgName} + cat > node_modules/${dep.pkgName}/package.json <<EOF { - "name": "${name}", - "version": "${(builtins.parseDrvName dep.name).version}" + "name": "${dep.pkgName}", + "version": "${getVersion dep}" } EOF - '') dep.names) (attrValues recursiveDeps))} + '') (attrValues recursiveDeps)} ) export HOME=$PWD/build-dir @@ -174,34 +200,32 @@ let cd $HOME # Remove shims - ${concatStrings (concatMap (dep: map (name: '' - rm node_modules/${name}/package.json - rmdir node_modules/${name} - '') dep.names) (attrValues recursiveDeps))} + ${concatMapStrings (dep: '' + rm node_modules/${dep.pkgName}/package.json + rmdir node_modules/${dep.pkgName} + '') (attrValues recursiveDeps)} mkdir -p $out/lib/node_modules # Install manual - ${concatStrings (map (name: '' - mv node_modules/${name} $out/lib/node_modules - rm -fR $out/lib/node_modules/${name}/node_modules - cp -r node_modules $out/lib/node_modules/${name}/node_modules - - if [ -e "$out/lib/node_modules/${name}/man" ]; then - mkdir -p $out/share - for dir in "$out/lib/node_modules/${name}/man/"*; do - mkdir -p $out/share/man/$(basename "$dir") - for page in "$dir"/*; do - ln -sv $page $out/share/man/$(basename "$dir") - done + mv node_modules/${pkgName} $out/lib/node_modules + rm -fR $out/lib/node_modules/${pkgName}/node_modules + cp -r node_modules $out/lib/node_modules/${pkgName}/node_modules + + if [ -e "$out/lib/node_modules/${pkgName}/man" ]; then + mkdir -p $out/share + for dir in "$out/lib/node_modules/${pkgName}/man/"*; do + mkdir -p $out/share/man/$(basename "$dir") + for page in "$dir"/*; do + ln -sv $page $out/share/man/$(basename "$dir") done - fi - '') args.passthru.names)} + done + fi # Symlink dependencies - ${concatStrings (mapAttrsToList (name: dep: '' - mv node_modules/${name} $out/lib/node_modules - '') peerDeps)} + ${concatMapStrings (dep: '' + mv node_modules/${dep.pkgName} $out/lib/node_modules + '') peerDeps} # Install binaries and patch shebangs mv node_modules/.bin $out/lib/node_modules 2>/dev/null || true @@ -214,19 +238,21 @@ let runHook postInstall ''; - preFixup = concatStringsSep "\n" (map (src: '' + preFixup = '' find $out -type f -print0 | xargs -0 sed -i 's|${src}|${src.name}|g' - '') src); + ''; shellHook = '' ${preShellHook} export PATH=${nodejs}/bin:$(pwd)/node_modules/.bin:$PATH mkdir -p node_modules - ${concatStrings (concatMap (dep: map (name: '' - ln -sfv ${dep}/lib/node_modules/${name} node_modules/ - '') dep.names) deps)} + ${concatMapStrings (dep: '' + ln -sfv ${dep}/lib/node_modules/${dep.pkgName} node_modules/ + '') deps} ${postShellHook} ''; + + passthru.pkgName = pkgName; } // (filterAttrs (n: v: n != "deps" && n != "resolvedDeps") args) // { name = "${ if bin == true then "bin-" else if bin == false then "node-" else "" |