PNpM CLI

pnpm/pnpm last check crawl paused · since 2026-09-25 707 releases
Notes
no notes yet
Release notes
view on github
7.0.0 · 1y+

Major Changes

  • Node.js 12 is not supported.

  • When using pnpm run <script>, all command line arguments after the script name are now passed to the script's argv, even --. For example, the command below will now pass --hello -- world to the echo script's argv:

    pnpm run echo --hello -- world
    

    Previously, flagged arguments (e.g. --silent) were interpreted as pnpm arguments unless -- came before it. If you want to pass options to pnpm, place them before the script name. For instance:

    pnpm --workspace-root --silent run echo --hello -- world
    

    Read more details about this in our docs. Related PR: #4290

  • The root package is excluded by default, when running pnpm -r exec|run|add #2769.

  • Filtering by path is done by globs.

    In pnpm v6, in order to pick packages under a certain directory, the following filter was used: --filter=./apps

    In pnpm v7, a glob should be used: --filter=./apps/**

    For easier upgrade, we have also added a setting to turn back filtering as it was in v6. Just set legacy-dir-filtering=true in .npmrc.

  • The NODE_PATH env variable is not set in the command shims (the files in node_modules/.bin). This env variable was really long and frequently caused errors on Windows.

    Also, the extend-node-path setting is removed.

    Related PR: #4253

  • The embed-readme setting is false by default.

  • Side effects cache is turned on by default. To turn it off, use side-effects-cache=false.

  • The npm_config_argv env variable is not set for scripts #4153.

  • pnpx is now just an alias of pnpm dlx.

    If you want to just execute the command of a dependency, run pnpm <cmd>. For instance, pnpm eslint.

    If you want to install and execute, use pnpm dlx <pkg name>.

  • pnpm install -g pkg will add the global command only to a predefined location. pnpm will not try to add a bin to the global Node.js or npm folder. To set the global bin directory, either set the PNPM_HOME env variable or the global-bin-dir setting.

  • pnpm pack should only pack a file as an executable if it's a bin or listed in the publishConfig.executableFiles array.

  • -W is not an alias of --ignore-workspace-root-check anymore. Just use -w or --workspace-root instead, which will also allow to install dependencies in the root of the workspace.

  • Allow to execute a lifecycle script in a directory that doesn't match the package's name. Previously this was only allowed with the --unsafe-perm CLI option #3709.

  • Local dependencies referenced through the file: protocol are hard linked (not symlinked) #4408. If you need to symlink a dependency, use the link: protocol instead.

  • strict-peer-dependencies is true by default #4427.

  • A prerelease version is always added as an exact version to package.json. If the next version of foo is 1.0.0-beta.1 then running pnpm add foo@next will add this to package.json:

    {
      "dependencies": {
        "foo": "1.0.0-beta.1"
      }
    }
    

    PR: #4435

  • Dependencies of the root workspace project are not used to resolve peer dependencies of other workspace projects #4469.

  • Don't hoist types by default to the root of node_modules #4459.

  • Any package with "prettier" in its name is hoisted.

  • Changed the location of the global store from ~/.pnpm-store to <pnpm home directory>/store

    On Linux, by default it will be ~/.local/share/pnpm/store On Windows: %LOCALAPPDATA%/pnpm/store On macOS: ~/Library/pnpm/store

    Related issue: #2574

    There is no migration script for moving the global packages from the old location to the old one. Just reinstall all your global packages with pnpm v7.

  • 4bed585e2: The next deprecated settings were removed:

    • frozen-shrinkwrap
    • prefer-frozen-shrinkwrap
    • shared-workspace-shrinkwrap
    • shrinkwrap-directory
    • lockfile-directory
    • shrinkwrap-only
    • store
  • Use a base32 hash instead of a hex to encode too long dependency paths inside node_modules/.pnpm #4552.

  • New setting added: git-shallow-hosts. When cloning repositories from "shallow-hosts", pnpm will use shallow cloning to fetch only the needed commit, not all the history #4548.

  • Lockfile version bumped to v5.4.

  • Exit with an error when running pnpm install in a directory that has no package.json file in it (and in parent directories) #4609.

Our Sponsors

<table> <tbody> <tr> <td align="center" valign="middle"> <a href="https://bit.dev/?utm_source=pnpm&utm_medium=release_notes" target="_blank"><img src="https://raw.githubusercontent.com/pnpm/pnpm.io/main/static/img/users/bit.svg" width="80"></a> </td> <td align="center" valign="middle"> <a href="https://prisma.io/?utm_source=pnpm&utm_medium=release_notes" target="_blank"><img src="https://raw.githubusercontent.com/pnpm/pnpm.io/main/static/img/users/prisma.svg" width="180"></a> </td> <td align="center" valign="middle"> <a href="https://leniolabs.com/?utm_source=pnpm&utm_medium=release_notes" target="_blank"><img src="https://raw.githubusercontent.com/pnpm/pnpm.io/main/static/img/users/leniolabs.jpg" width="80"></a> </td> <td align="center" valign="middle"> <a href="https://vercel.com/?utm_source=pnpm&utm_medium=release_notes" target="_blank"><img src="https://raw.githubusercontent.com/pnpm/pnpm.io/main/static/img/users/vercel.svg" width="180"></a> </td> <td align="center" valign="middle"> <a href="https://www.takeshape.io/?utm_source=pnpm&utm_medium=release_notes" target="_blank"><img src="https://raw.githubusercontent.com/pnpm/pnpm.io/main/static/img/users/takeshape.svg" width="280"></a> </td> </tr> </tbody> </table>

What's Changed

New Contributors

Full Changelog: https://github.com/pnpm/pnpm/compare/v6.31.0...v7.0.0