过滤
过滤允许你将命令限制在特定的包子集上。
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