前言
pnpm
是一个快速、节省磁盘空间的包管理器,近期发布了v7.0.0
版本重大更新。
主要变化
-
不再支持
Node.js 12
-
当使用
pnpm run <script>
,所有的命令行参数都会传递给脚本(包括--
)。例如,pnpm run echo --hello -- world
会把--hello -- world
传递给echo
脚本作为参数。之前,如果不添加--
,标记型参数(例如--silent
)都会当成pnpm
的参数。 -
pnpm -r exec|run|add
命令运行时默认排除根包 -
使用
globs
语法来进行filter
操作 -
- 在
pnpm 6
,为了选取特定目录的包,命令是--filter=./apps
- 在
pnpm 7
,应该改为:--filter=./apps/**
- 选择支持
pnpm 6
风格时候,在.npmrc
里设置legacy-dir-filtering=true
- 在
-
默认的命令
shims
不再包含 NODE_PATH env 变量。这个变量经常在windows
导致问题。- 去除了
extend-node-path
设定 - 相关 pr
- 去除了
-
embed-readme
默认改为false
-
默认开启副作用缓存,关闭需要设置
side-effects-cache=false
-
默认不在添加
npm_config_argv
环境变量 -
pnpx
现在只是pnpm dlx
的别名- 如果你只是想执行一个依赖的命令,执行
pnpm <cmd>
,例如pnpm eslint
- 如果你想安装且执行,使用
pnpm dlx <pkg name>
- 如果你只是想执行一个依赖的命令,执行
-
pnpm install -g pkg
会在预先设定的地址安装全局命令。pnpm
不会在全局的Node.js
或者npm
的文件夹执行安装命令。设置全局命令文件夹,要么设置PNPM_HOME
环境变量或者global-bin-dir
设置。 -
pnpm pack
只会把bin
或者列在publishConfig.executableFiles
里的文件打包成可执行文件。 -
-W
不再是--ignore-workspace-root-check
的别名。使用-w
或者--workspace-root
来代替这个参数。使用-w
会允许在根工作目录安装依赖 -
允许在一个文件夹执行不匹配包名的生命周期脚本。之前需要设置
--unsafe-perm
才可以执行。 -
本地依赖有
file
: 协议的使用硬连接(不是符号链接)。如果你需要符号链接一个依赖,使用link
:协议。 -
默认
strict-peer-dependencies
设置为true
。 -
package.json
会有一个总是存在的预发布版本。如果foo
的next
版本为1.0.0-beta.1
,执行pnpm add foo@next
会给 package.json 增加。{ "dependencies": { "foo": "1.0.0-beta.1" } }
-
根目录项目的依赖不会解析其他工作空间项目的
peer
依赖。 -
默认不再提升
types
到根node_modules
。 -
提升
prettier
的规则,改为任意包含prettier
的名字都提升到根工作目录。 -
全局
store
的文件夹从~/.pnpm-store
改为<pnpm home directory>/store
-
- 在
Linux
,默认是~/.local/share/pnpm/store
- 在
Windows
,默认是%LOCALAPPDATA%/pnpm/store
- 在
macOS
,默认是~/Library/pnpm/store
- 在
-
去除废弃设定
- frozen-shrinkwrap
- prefer-frozen-shrinkwrap
- shared-workspace-shrinkwrap
- shrinkwrap-directory
- lockfile-directory
- shrinkwrap-only
- store
-
node_modules/.pnpm
中过于长的依赖路径由hex
编码改为base32
。 -
新增设置
git-shallow-hosts
。当从shallow-hosts
拷贝仓库时,pnpm
会只浅拷贝需要的commit
,而不是所有的历史。 -
Lockfile
版本升级为v5.4
-
如果一个文件夹(及父文件夹)没有
package.json
,执行pnpm install
会报错退出。
更多详细信息,更查看:github.com/pnpm/pnpm/r…