Node#
The Node provider supports NPM, Yarn, Yarn 2, PNPM and Bun.
Environment Variables#
The Node provider sets the following environment variables:
CI=true
NODE_ENV=production
NPM_CONFIG_PRODUCTION=false
: Ensure that dev deps are always installedNIXPACKS_MOON_APP_NAME
: Provide a name of the app you want to build from your moon repo.NIXPACKS_NX_APP_NAME
: Provide a name of the NX app you want to build from your NX MonorepoNIXPACKS_TURBO_APP_NAME
: Provide the name of the app you want to build from your Turborepo, if there is nostart
pipeline.
Setup#
The following major versions are available
16
18
(Default)20
22
The version can be overridden by
- Setting the
NIXPACKS_NODE_VERSION
environment variable - Specifying the
engines.node
field inpackage.json
Only a major version can be specified. For example, 18.x
or 20
.
Node Canvas
If node-canvas is found in the package.json
file, then the libuuid
and libGL
libraries are made available in the environment.
Install#
All dependencies found in package.json
are installed with either NPM, Yarn, PNPM, or Bun (depending on the lockfile detected).
Build#
The build script found in package.json
if it exists.
Or, if it's an NX Monorepo (detected if
nx.json
exists), thebuild
pipeline for theNIXPACKS_NX_APP_NAME
app will be called. Otherwise, it will run build for thedefault_project
innx.json
. The build command is(npm|pnpm|yarn|bun) run build <NxAppName>:build:production
.Or, if it's a Turborepo monorepo (detected if
turbo.json
exists), thebuild
pipeline will be called (if it exists). Otherwise, thebuild
script of thepackage.json
referenced byNIXPACKS_TURBO_APP_NAME
will be called, ifNIXPACKS_TURBO_APP_NAME
is provided. Otherwise, it will fall back to the build script found inpackage.json
at the monorepos root.Or, if it's a moon repo (detected if
.moon/workspace.yml
exists), thebuild
task for theNIXPACKS_MOON_APP_NAME
will be called. The task name can be customized withNIXPACKS_MOON_BUILD_TASK
. This will run the commandmoon run <app_name>:<build_task>
.
Start#
The start command priority is:
- If it's a moon repo
- It will use
NIXPACKS_MOON_APP_NAME
for the app name if provided, otherwise falls through to the next step. - It will use
NIXPACKS_MOON_BUILD_TASK
orbuild
for the task to run.
- It will use
- If it's an NX Monorepo
- It will use
NIXPACKS_NX_APP_NAME
for the app name if provided, otherwise it will use thedefault_project
fromnx.json
- If the app has a
start
targetnpx nx run <appName>:start:production
or justnpx nx run <appName>:start
if no production configuration is present - If the app is a NextJS project:
npm run start
- If
targets.build.options.main
exists in the appsProject.json
:node <outputPath>/<mainFileName>.js
(e.gnode dist/apps/my-app/main.js
) - Fallback:
node <outputPath>/index.js
(e.gnode dist/apps/my-app/index.js
)
- It will use
- If Turborepo is detected
- If a
start
pipeline exists, call that; - Otherwise, if
NIXPACKS_TURBO_APP_NAME
is provided, call thestart
script of that package; - Otherwise, run
npx turbo run start
, which will simply run allstart
scripts in the monorepo in parallel.
- If a
- Start script in
package.json
- Main file
index.js
Caching#
These directories are cached between builds
- Install: Global NPM/Yarn/PNPM cache directories
- Install (if Cypress detected):
~/.cache/Cypress
- Build:
node_modules/.cache
- Build (if NextJS detected):
.next/cache
- Build (if its a moon repo):
.moon/cache
- Build (if its an NX Monorepo):
<outputPathForApp>
Custom cache directories#
You can specify cacheDirectories
in package.json
. Each directory that is provided in that field will be added to the build-time cache.
Corepack#
Nixpacks has first class support for Corepack, an experimental tool that enables installing specific versions of Node based package managers.
For example, To install the latest version of PNPM, add a packageManager
key to your package.json
file
{ "packageManager": "pnpm@latest" }
Corepack will only be used on Node 16 and above.
Bun Support#
We support Bun, but due to Bun being in alpha, it is unstable and very experimental.