How Do I Install PNPM

Nov 07, 2021

If you use a Node.js version manager like nvm or fnm, the npm packages you installed globally using npm or pnpm will be missing when you switch Node versions, you can use nvm's -reinstall-packages-from flag to reinstall globally installed npm packages from the previous Node version, but fnm requires you to write your own script to do this.

The reason for this is that global modules installed by npm and pnpm are located in the same directory as the node executable, which is not a problem if you are using Yarn, whose global modules are installed in the ~/.yarn directory.

I don't want to have to reinstall the global module every time I switch Node versions, so the solution I found was to change the directory where pnpm installs the global module (and the global directory for binary files), which can be done with npm config:

npm config set global-bin-dir $HOME/.pnpm/bin
npm config set global-dir $HOME/.pnpm/global-modules

These two configurations only work for pnpm, npm doesn't care, and since the npm documentation sucks, I could not find out how to configure npm the same way. Hopefully, I won't be using npm in the future.

Since the installation directory of npm can't be changed, I can't use it to install pnpm here, because then pnpm will still be installed in node directory. Fortunately, there is another way to install pnpm itself with pnpm:

curl -f https://get.pnpm.io/v6.16.js | node - add --global pnpm

How this command works: curl downloads the bundled pnpm file, and then node reads the stdout of the previous command from stdin to execute it, and - can be followed by the CLI arguments to execute the script.

After the installation you will see that the pnpm executable appears in $HOME/.pnpm/bin/pnpm.

Finally you need to add $HOME/.pnpm/bin to the system's $PATH.

export PATH="$PATH:$HOME/.pnpm/bin"