◆

pnpm filter 过滤命令用法(包名、目录、排除)

2023-03-03 04:230

monorepo 里包一多,就需要「只对其中某几个包执行命令」的能力:单独构建一个子包、给指定包装依赖、或者跑全量任务时排除掉体积大的那几个。pnpm --filter 就是干这件事的,它先按条件筛出一批包,再在这批包里执行后面的脚本,避免了 cd 进每个目录逐个执行。

筛选维度有两类:按包名(package.json 里的 name,支持 * 通配和 scope 匹配)和按目录路径(支持 glob)。两类都能取反,在前面加 ! 变成排除。选目录还是选包名取决于场景——按包名更稳定,目录结构调整了不受影响;按目录更适合「这个文件夹下所有包」这种批量意图。

filter 命令

下面这组覆盖了常用的几种写法:精确包名、scope 通配、目录 glob,以及两种取反形式。注意 ! 在 shell 里是历史扩展符,bash 交互式环境下必须转义成 \!(或者用单引号把整个参数包起来),否则会被 shell 抢先解释掉。

--filter "./packages/**" 里的双星号匹配任意层级子目录,路径要加引号,防止 shell 提前做 glob 展开。

# 指定包名
pnpm --filter @vft/utils clean

# 指定包名范围
pnpm --filter @vft/* clean
pnpm --filter *@vft/* clean

# 匹配目录
pnpm --filter "./packages/**" clean

# 排除包名
pnpm --filter=\!@vft/utils clean

# 排除目录
pnpm --filter=\!./packages clean

注意事项

  • --filter 后面接的是 pnpm 自己的子命令和 workspace 脚本名。执行的脚本在某个包里不存在时,pnpm 默认会跳过而不是报错,所以命令「跑了但什么也没发生」,先确认目标包的 package.json 里有这个 script。
  • 包名带 * 时也要注意 shell 展开:如果当前目录下正好有匹配的文件名,@vft/* 会被 shell 替换掉。加引号写成 --filter "@vft/*" 更保险。
  • filter 还支持依赖关系后缀,很实用:...pkg 表示 pkg 及其所有依赖,pkg... 表示 pkg 及所有依赖它的包。改了底层工具包想验证影响面时,用 --filter "pkg..." 一次把下游全跑一遍。
  • 多个条件可以叠加,写多个 --filter 参数取并集。
💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEpnpm filter 过滤命令用法(包名、目录、排除)加载中