跳到主要内容
版本:Next

过滤

过滤允许你将命令限制在特定的包子集上。

pnpm 支持丰富的选择器语法,可以通过名称或关系来选择包。

选择器可以通过 --filter(或 -F)标志指定:

pnpm --filter <package_selector> <command>

匹配

--filter <package_name>

要选择一个确切的包,只需指定其名称(@scope/pkg)或使用模式来 选择一组包(@scope/*)。

示例:

pnpm --filter "@babel/core" test
pnpm --filter "@babel/*" test
pnpm --filter "*core" test

指定包的作用域是可选的,所以如果找不到 core--filter=core 将会选择 @babel/core。 但是,如果工作区中有多个同名的包(例如 @babel/core@types/core), 那么不带作用域的过滤将不会选择任何包。

--filter <package_name>...

要选择一个包及其依赖项(直接和非直接),在包名后添加省略号:<package_name>...。 例如,下一个命令将运行 foo 及其所有依赖项的测试:

pnpm --filter foo... test

你可以使用模式来选择一组根包:

pnpm --filter "@babel/preset-*..." test

--filter <package_name>^...

要只选择一个包的依赖项(直接和非直接),在名称后添加前面提到的省略号,并在前面加上尖号。 例如,下一个命令将运行 foo 的所有依赖项的测试:

pnpm --filter "foo^..." test

--filter ...<package_name>

要选择一个包及其依赖它的包(直接和非直接),在包名前添加省略号:...<package_name>。 例如,这将运行 foo 及所有依赖它的包的测试:

pnpm --filter ...foo test

--filter "...^<package_name>"

要只选择依赖某个包的包(直接和非直接),在包名前添加省略号后跟尖号。 例如,这将运行所有依赖 foo 的包的测试:

pnpm --filter "...^foo" test

--filter ./<glob>,--filter {<glob>}

相对于当前工作目录匹配项目的 glob 模式。

pnpm --filter "./packages/**" <cmd>

包含指定目录下的所有项目。

它也可以与省略号和尖号运算符一起使用来选择依赖/被依赖的包:

pnpm --filter ...{<directory>} <cmd>
pnpm --filter {<directory>}... <cmd>
pnpm --filter ...{<directory>}... <cmd>

它还可以与 [<since>] 组合使用。例如,要选择目录内的所有已更改项目:

pnpm --filter "{packages/**}[origin/master]" <cmd>
pnpm --filter "...{packages/**}[origin/master]" <cmd>
pnpm --filter "{packages/**}[origin/master]..." <cmd>
pnpm --filter "...{packages/**}[origin/master]..." <cmd>

或者你可以选择某个目录中名称匹配给定模式的所有包:

pnpm --filter "@babel/*{components/**}" <cmd>
pnpm --filter "@babel/*{components/**}[origin/master]" <cmd>
pnpm --filter "...@babel/*{components/**}[origin/master]" <cmd>

--filter "[<since>]"

选择自指定提交/分支以来更改的所有包。可以在前面或后面加上 ... 来包含依赖项/依赖它的包。

例如,下一个命令将在所有自 master 分支以来更改的包以及依赖这些包的包中运行测试:

pnpm --filter "...[origin/master]" test

--fail-if-no-match

如果你希望在没有包匹配过滤器时 CLI 失败,请使用此标志。

排除

任何过滤器选择器前面加上 "!" 都可以作为排除运算符。在 zsh(可能还有其他 shell)中,"!" 应该转义为 \!

例如,这将在除 foo 之外的所有项目中运行命令:

pnpm --filter=!foo <cmd>

这将在 lib 目录之外的所有项目中运行命令:

pnpm --filter=!./lib <cmd>

多重性

当包被过滤时,会选择所有匹配至少一个选择器的包。你可以使用任意多个过滤器:

pnpm --filter ...foo --filter bar --filter baz... test

--filter-prod <filtering_pattern>

--filter 功能相同,但在从工作区选择依赖项目时会忽略 devDependencies

--test-pattern <glob>

test-pattern 允许检测修改的文件是否与测试相关。 如果是,则不包括此类修改包的依赖包。

此选项在使用"自某次提交以来更改"过滤器时很有用。例如,下一个命令将在所有更改的包中运行测试, 如果更改在包的源代码中,也会在依赖包中运行测试:

pnpm --filter="...[origin/master]" --test-pattern="test/*" test

--changed-files-ignore-pattern <glob>

在过滤自指定提交/分支以来更改的项目时,允许通过 glob 模式忽略已更改的文件。

使用示例:

pnpm --filter="...[origin/master]" --changed-files-ignore-pattern="**/README.md" run build