From ffcaf44af24c074e54fe404efb773720d3c47d49 Mon Sep 17 00:00:00 2001 From: Ashelyn Rose Date: Mon, 17 Jun 2024 16:26:50 -0600 Subject: [PATCH] build node_modules without breaking chroot --- .gitignore | 1 + flake.nix | 47 +++++++++++++++++++++++++++++++++-------------- 2 files changed, 34 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 7ed189a..d91ebd5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .next/ node_modules/ out/ +result diff --git a/flake.nix b/flake.nix index fa030d9..195c089 100644 --- a/flake.nix +++ b/flake.nix @@ -21,26 +21,45 @@ nodejs = pkgs.nodejs-18_x; - node_modules = pkgs.stdenv.mkDerivation { - name = "node_modules"; + src = filter { + root = ./.; + include = [ + ./package.json + ./package-lock.json + ]; + }; - src = filter { - root = ./.; - include = [ - ./package.json - ./package-lock.json - ]; - }; + # Read lockfile + packageLock = builtins.fromJSON(builtins.readFile (src + "/package-lock.json")); + + # Convert to tarball dep list + deps = builtins.attrValues (removeAttrs packageLock.packages [ "" ]) + ++ builtins.attrValues (removeAttrs (packageLock.dependencies or {} ) [ "" ]) + ; + tarballs = map (p: pkgs.fetchurl { url = p.resolved; hash = p.integrity; }) deps; + tarballsFile = pkgs.writeTextFile { + name = "tarballs"; + text = builtins.concatStringsSep "\n" tarballs; + }; - __noChroot = true; + # build npm cache + ashenearth_modules = pkgs.stdenv.mkDerivation { + inherit src; - configurePhase = '' - export HOME=$TMP - ''; + name = "node_modules"; buildInputs = [ nodejs ]; buildPhase = '' + export HOME=$PWD/.home + export npm_config_cache=$PWD/.npm + + while read package + do + echo "caching $(echo $package | sed 's/\/nix\/store\/[^-]*-//')" + npm cache add "$package" + done <${tarballsFile} + ${nodejs}/bin/npm ci ''; @@ -70,7 +89,7 @@ ''; configurePhase = '' - ln -sf ${node_modules}/node_modules node_modules + ln -sf ${ashenearth_modules}/node_modules node_modules export HOME=$TMP '';