Important
This action has a successor: pnpm/setup.
For pnpm v11 and newer, use pnpm/setup instead. It downloads pnpm's self-contained release binary (no Node.js or npm required) and can install a JavaScript runtime (Node.js, Bun, or Deno) in the same step, replacing actions/setup-node.
pnpm/action-setup remains the action to use for installing pnpm v10 and older. See Migrating to pnpm/setup below.
Install pnpm package manager.
The v2 version of this action has stopped working with newer Node.js versions. Please, upgrade to the latest version to fix any issues.
pnpm/setup installs pnpm v11+ as a native standalone executable and can install Node.js, Bun, or Deno in the same step, so a typical workflow no longer needs actions/setup-node or an explicit pnpm install step:
steps:
- uses: actions/checkout@v6
# Before:
# - uses: pnpm/action-setup@v6
# with:
# version: 10
# cache: true
# - uses: actions/setup-node@v4
# with:
# node-version: 22
# - run: pnpm install
# After:
- uses: pnpm/setup@v1
with:
version: 11
runtime: node@22
cache: trueThe version input can be omitted only when packageManager (or devEngines.packageManager) in package.json declares pnpm v11 or newer; otherwise keep it explicit, since pnpm/setup requires pnpm v11+.
Input and output changes:
pnpm/action-setup |
pnpm/setup |
Notes |
|---|---|---|
version |
version |
Must resolve to pnpm v11 or newer. As before, it can be omitted when packageManager (or devEngines.packageManager) is set in package.json. |
dest |
dest |
Unchanged. |
run_install |
install |
pnpm/setup runs pnpm install automatically when a package.json is present (install: true by default); set install: false to skip it. The object/array form (recursive, cwd, args) is not supported — run those commands in separate steps. |
cache |
cache |
Unchanged. |
cache_dependency_path |
cache-dependency-path |
Renamed to kebab-case. |
package_json_file |
package-json-file |
Renamed to kebab-case. |
standalone |
removed | pnpm/setup always installs the standalone native executable. |
| n/a | runtime |
New: installs Node.js, Bun, or Deno (e.g. node@22, bun@latest, deno@2), or reads devEngines.runtime from package.json. |
| n/a | token |
New: GitHub token for release lookup; defaults to ${{ github.token }} and rarely needs to be set. |
bin_dest (output) |
bin-dest (output) |
Renamed to kebab-case. New outputs runtime-name and runtime-version describe the installed runtime. |
Version of pnpm to install.
Optional when there is a packageManager field in the package.json.
otherwise, this field is required It supports npm versioning scheme, it could be an exact version (such as 10.9.8), or a version range (such as 10, 10.x.x, 10.9.x, ^10.9.8, *, etc.), or latest.
Optional Where to store pnpm files.
Optional (default: null) If specified, run pnpm install.
If run_install is either null or false, pnpm will not install any npm package.
If run_install is true, pnpm will install dependencies recursively.
If run_install is a YAML string representation of either an object or an array, pnpm will execute every install commands.
Optional (type: boolean, default: false) Whether to use pnpm recursive install.
Optional (type: string) Working directory when run pnpm [recursive] install.
Optional (type: string[]) Additional arguments after pnpm [recursive] install, e.g. [--ignore-scripts, --strict-peer-dependencies].
Optional (type: boolean, default: false) Whether to cache the pnpm store directory.
Optional (type: string, default: pnpm-lock.yaml) File path to the pnpm lockfile, whose contents hash will be used as a cache key. Accepts multiple paths delimited by newlines.
Optional (type: string, default: package.json) File path to the package.json/package.yaml to read "packageManager" configuration.
Optional (type: boolean, default: false) When set to true, @pnpm/exe, which is a Node.js bundled package, will be installed, enabling using pnpm without Node.js.
This is useful when you want to use a incompatible pair of Node.js and pnpm.
Expanded path of inputs#dest.
Location of pnpm and pnpx command.
This works when the repo either doesn't have a package.json or has a package.json but it doesn't specify packageManager.
on:
- push
- pull_request
jobs:
install:
runs-on: ubuntu-latest
steps:
- uses: pnpm/action-setup@v6
with:
version: 10Omit version input to use the version in the packageManager field in the package.json.
on:
- push
- pull_request
jobs:
install:
runs-on: ubuntu-latest
steps:
- uses: pnpm/action-setup@v6on:
- push
- pull_request
jobs:
install:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
with:
version: 10
run_install: |
- recursive: true
args: [--strict-peer-dependencies]
- args: [--global, gulp, prettier, typescript]on:
- push
- pull_request
jobs:
cache-and-install:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
name: Install pnpm
with:
version: 10
cache: true
- name: Install dependencies
run: pnpm installNote: You don't need to run pnpm store prune at the end; post-action has already taken care of that.
on:
- push
- pull_request
jobs:
cache-and-install-multiple:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6
- uses: pnpm/action-setup@v6
with:
version: 10
cache: true
cache_dependency_path: |
one/pnpm-lock.yaml
two/pnpm-lock.yaml
run_install: |
- cwd: one
- cwd: twoThis action does not set up Node.js. Use actions/setup-node yourself. If you are on pnpm v11 or newer, pnpm/setup can install pnpm and Node.js in a single step.