mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-01-23 21:33:49 +00:00
b6e4b86809
This is an alternative to `fetchNpmDeps` that is notably different in that it uses metadata from `package.json` & `package-lock.json` instead of specifying a fixed-output hash. Notable features: - IFD free. - Only fetches a node dependency once. No massive FODs. - Support for URL, Git and path dependencies. - Uses most of the existing `npmHooks` `importNpmLock` can be used _only_ in the cases where we need to check in a `package-lock.json` in the tree. Currently this means that we have 13 packages that would be candidates to use this function, though I expect most usage to be in private repositories. This is upstreaming the builder portion of https://github.com/adisbladis/buildNodeModules into nixpkgs (different naming but the code is the same). I will archive this repository and consider nixpkgs the new upstream once it's been merged. For more explanations and rationale see https://discourse.nixos.org/t/buildnodemodules-the-dumbest-node-to-nix-packaging-tool-yet/35733 Example usage: ``` nix stdenv.mkDerivation { pname = "my-nodejs-app"; version = "0.1.0"; src = ./.; nativeBuildInputs = [ importNpmLock.hooks.npmConfigHook nodejs nodejs.passthru.python # for node-gyp npmHooks.npmBuildHook npmHooks.npmInstallHook ]; npmDeps = buildNodeModules.fetchNodeModules { npmRoot = ./.; }; } ```
71 lines
2.0 KiB
Bash
71 lines
2.0 KiB
Bash
# shellcheck shell=bash
|
|
|
|
npmConfigHook() {
|
|
echo "Executing npmConfigHook"
|
|
|
|
if [ -n "${npmRoot-}" ]; then
|
|
pushd "$npmRoot"
|
|
fi
|
|
|
|
if [ -z "${npmDeps-}" ]; then
|
|
echo "Error: 'npmDeps' should be set when using npmConfigHook."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Configuring npm"
|
|
|
|
export HOME="$TMPDIR"
|
|
export npm_config_nodedir="@nodeSrc@"
|
|
export npm_config_node_gyp="@nodeGyp@"
|
|
npm config set offline true
|
|
npm config set progress false
|
|
npm config set fund false
|
|
|
|
echo "Installing patched package.json/package-lock.json"
|
|
|
|
# Save original package.json/package-lock.json for closure size reductions.
|
|
# The patched one contains store paths we don't want at runtime.
|
|
mv package.json .package.json.orig
|
|
if test -f package-lock.json; then # Not all packages have package-lock.json.
|
|
mv package-lock.json .package-lock.json.orig
|
|
fi
|
|
cp --no-preserve=mode "${npmDeps}/package.json" package.json
|
|
cp --no-preserve=mode "${npmDeps}/package-lock.json" package-lock.json
|
|
|
|
echo "Installing dependencies"
|
|
|
|
if ! npm install --ignore-scripts $npmInstallFlags "${npmInstallFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then
|
|
echo
|
|
echo "ERROR: npm failed to install dependencies"
|
|
echo
|
|
echo "Here are a few things you can try, depending on the error:"
|
|
echo '1. Set `npmFlags = [ "--legacy-peer-deps" ]`'
|
|
echo
|
|
|
|
exit 1
|
|
fi
|
|
|
|
patchShebangs node_modules
|
|
|
|
npm rebuild $npmRebuildFlags "${npmRebuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"
|
|
|
|
patchShebangs node_modules
|
|
|
|
# Canonicalize symlinks from relative paths to the Nix store.
|
|
node @canonicalizeSymlinksScript@ @storePrefix@
|
|
|
|
# Revert to pre-patched package.json/package-lock.json for closure size reductions
|
|
mv .package.json.orig package.json
|
|
if test -f ".package-lock.json.orig"; then
|
|
mv .package-lock.json.orig package-lock.json
|
|
fi
|
|
|
|
if [ -n "${npmRoot-}" ]; then
|
|
popd
|
|
fi
|
|
|
|
echo "Finished npmConfigHook"
|
|
}
|
|
|
|
postConfigureHooks+=(npmConfigHook)
|