3
0
Fork 0
forked from mirrors/nixpkgs

Merge pull request #233804 from lilyinstarlight/feature/npm-workspaces

buildNpmPackage: add npmWorkspace and npmPruneFlags args
This commit is contained in:
Mario Rodas 2023-07-08 06:45:46 -05:00 committed by GitHub
commit 43b091f45c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 13 additions and 7 deletions

View file

@ -196,12 +196,14 @@ buildNpmPackage rec {
* `npmDepsHash`: The output hash of the dependencies for this project. Can be calculated in advance with [`prefetch-npm-deps`](#javascript-buildNpmPackage-prefetch-npm-deps). * `npmDepsHash`: The output hash of the dependencies for this project. Can be calculated in advance with [`prefetch-npm-deps`](#javascript-buildNpmPackage-prefetch-npm-deps).
* `makeCacheWritable`: Whether to make the cache writable prior to installing dependencies. Don't set this unless npm tries to write to the cache directory, as it can slow down the build. * `makeCacheWritable`: Whether to make the cache writable prior to installing dependencies. Don't set this unless npm tries to write to the cache directory, as it can slow down the build.
* `npmBuildScript`: The script to run to build the project. Defaults to `"build"`. * `npmBuildScript`: The script to run to build the project. Defaults to `"build"`.
* `npmWorkspace`: The workspace directory within the project to build and install.
* `dontNpmBuild`: Option to disable running the build script. Set to `true` if the package does not have a build script. Defaults to `false`. Alternatively, setting `buildPhase` explicitly also disables this. * `dontNpmBuild`: Option to disable running the build script. Set to `true` if the package does not have a build script. Defaults to `false`. Alternatively, setting `buildPhase` explicitly also disables this.
* `dontNpmInstall`: Option to disable running `npm install`. Defaults to `false`. Alternatively, setting `installPhase` explicitly also disables this. * `dontNpmInstall`: Option to disable running `npm install`. Defaults to `false`. Alternatively, setting `installPhase` explicitly also disables this.
* `npmFlags`: Flags to pass to all npm commands. * `npmFlags`: Flags to pass to all npm commands.
* `npmInstallFlags`: Flags to pass to `npm ci` and `npm prune`. * `npmInstallFlags`: Flags to pass to `npm ci`.
* `npmBuildFlags`: Flags to pass to `npm run ${npmBuildScript}`. * `npmBuildFlags`: Flags to pass to `npm run ${npmBuildScript}`.
* `npmPackFlags`: Flags to pass to `npm pack`. * `npmPackFlags`: Flags to pass to `npm pack`.
* `npmPruneFlags`: Flags to pass to `npm prune`. Defaults to the value of `npmInstallFlags`.
#### prefetch-npm-deps {#javascript-buildNpmPackage-prefetch-npm-deps} #### prefetch-npm-deps {#javascript-buildNpmPackage-prefetch-npm-deps}

View file

@ -22,7 +22,7 @@
, npmBuildScript ? "build" , npmBuildScript ? "build"
# Flags to pass to all npm commands. # Flags to pass to all npm commands.
, npmFlags ? [ ] , npmFlags ? [ ]
# Flags to pass to `npm ci` and `npm prune`. # Flags to pass to `npm ci`.
, npmInstallFlags ? [ ] , npmInstallFlags ? [ ]
# Flags to pass to `npm rebuild`. # Flags to pass to `npm rebuild`.
, npmRebuildFlags ? [ ] , npmRebuildFlags ? [ ]
@ -30,6 +30,10 @@
, npmBuildFlags ? [ ] , npmBuildFlags ? [ ]
# Flags to pass to `npm pack`. # Flags to pass to `npm pack`.
, npmPackFlags ? [ ] , npmPackFlags ? [ ]
# Flags to pass to `npm prune`.
, npmPruneFlags ? npmInstallFlags
# Value for npm `--workspace` flag and directory in which the files to be installed are found.
, npmWorkspace ? null
, ... , ...
} @ args: } @ args:

View file

@ -14,7 +14,7 @@ npmBuildHook() {
exit 1 exit 1
fi fi
if ! npm run "$npmBuildScript" $npmBuildFlags "${npmBuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then if ! npm run ${npmWorkspace+--workspace=$npmWorkspace} "$npmBuildScript" $npmBuildFlags "${npmBuildFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"; then
echo echo
echo 'ERROR: `npm build` failed' echo 'ERROR: `npm build` failed'
echo echo

View file

@ -13,8 +13,8 @@ npmInstallHook() {
while IFS= read -r file; do while IFS= read -r file; do
local dest="$packageOut/$(dirname "$file")" local dest="$packageOut/$(dirname "$file")"
mkdir -p "$dest" mkdir -p "$dest"
cp "$file" "$dest" cp "${npmWorkspace-.}/$file" "$dest"
done < <(@jq@ --raw-output '.[0].files | map(.path) | join("\n")' <<< "$(npm pack --json --dry-run $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")") done < <(@jq@ --raw-output '.[0].files | map(.path) | join("\n")' <<< "$(npm pack --json --dry-run ${npmWorkspace+--workspace=$npmWorkspace} $npmPackFlags "${npmPackFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}")")
while IFS=" " read -ra bin; do while IFS=" " read -ra bin; do
mkdir -p "$out/bin" mkdir -p "$out/bin"
@ -22,13 +22,13 @@ npmInstallHook() {
done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then done < <(@jq@ --raw-output '(.bin | type) as $typ | if $typ == "string" then
.name + " " + .bin .name + " " + .bin
elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n") elif $typ == "object" then .bin | to_entries | map(.key + " " + .value) | join("\n")
else "invalid type " + $typ | halt_error end' package.json) else "invalid type " + $typ | halt_error end' "${npmWorkspace-.}/package.json")
local -r nodeModulesPath="$packageOut/node_modules" local -r nodeModulesPath="$packageOut/node_modules"
if [ ! -d "$nodeModulesPath" ]; then if [ ! -d "$nodeModulesPath" ]; then
if [ -z "${dontNpmPrune-}" ]; then if [ -z "${dontNpmPrune-}" ]; then
npm prune --omit dev --no-save $npmInstallFlags "${npmInstallFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}" npm prune --omit=dev --no-save ${npmWorkspace+--workspace=$npmWorkspace} $npmPruneFlags "${npmPruneFlagsArray[@]}" $npmFlags "${npmFlagsArray[@]}"
fi fi
find node_modules -maxdepth 1 -type d -empty -delete find node_modules -maxdepth 1 -type d -empty -delete