Filtragem

A filtragem permite restringir comandos a subconjuntos específicos de pacotes.

O pnpm suporta uma sintaxe de seletor rica para selecionar pacotes por nome ou por relação.

Selectors may be specified via the --filter (or -F) flag:

pnpm --filter <package_selector> <command>

Coincidindo#

--filter <package_name>#

To select an exact package, just specify its name (@scope/pkg) or use a pattern to select a set of packages (@scope/*).

Exemplos:

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

Specifying the scope of the package is optional, so --filter=core will pick @babel/core if core is not found. However, if the workspace has multiple packages with the same name (for instance, @babel/core and @types/core), then filtering without scope will pick nothing.

--filter <package_name>...#

To select a package and its dependencies (direct and non-direct), suffix the package name with an ellipsis: <package_name>.... For instance, the next command will run tests of foo and all of its dependencies:

pnpm --filter foo... test

Você pode usar um padrão para selecionar um conjunto de pacotes raiz:

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

--filter <package_name>^...#

Para selecionar APENAS as dependências de um pacote (diretas e não diretas), insira as reticências mencionadas precedidas por um acento circunflexo antes do nome. For instance, the next command will run tests for all of foo's dependencies:

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

--filter ...<package_name>#

To select a package and its dependent packages (direct and non-direct), prefix the package name with an ellipsis: ...<package_name>. For instance, this will run the tests of foo and all packages dependent on it:

pnpm --filter ...foo test

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

Para selecionar APENAS as dependências de um pacote (tanto diretas quanto não-diretas), insira reticências seguidas de um acento circunflexo antes do nome do pacote. For instance, this will run tests for all packages dependent on foo:

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

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

Um padrão glob relativo ao diretório de trabalho atual correspondendo aos projetos.

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

Inclui todos os projetos que estão sob o diretório especificado.

Ele pode ser usado com os operadores ellipsis e chevron para selecionar dependentes/dependências também:

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

It may also be combined with [<since>]. Por exemplo, para selecionar todos os projetos alterados dentro de um diretório:

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

The pattern language is the usual one: * and ? match within one path segment, ** crosses segments, and a character class such as [ab] matches one of the listed characters. Neither * nor ? matches a name that begins with a dot, so packages/* skips packages/.cache. Name a dot-prefixed directory explicitly to select it.

Ou você pode selecionar todos os pacotes de um diretório com nomes que correspondam ao padrão fornecido:

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

legacyDirFiltering#

  • Default: false
  • Type: Boolean

{<dir>} is matched as a glob pattern: {packages/*} selects the projects one level below packages/, and it takes a ** to reach deeper. Set legacyDirFiltering to true in pnpm-workspace.yaml to restore the older behavior, where the selector named a directory and matched every project in the subtree below it:

pnpm-workspace.yaml
legacyDirFiltering: true

The setting only applies to the selectors you write. The workspace-root selectors pnpm generates for itself (the !{<workspace-root>} a recursive run / exec / add / test appends, and the {<workspace-root>} that --workspace-root appends) are always matched as globs.

--filter "[<since>]"#

Seleciona todos os pacotes alterados desde o commit/branch especificado. May be suffixed or prefixed with ... to include dependencies/dependents.

For example, the next command will run tests in all changed packages since master and on any dependent packages:

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

Since v12.7.0, <since> is compared against the commit where the current branch forked from it (the merge base), so projects changed only by newer commits on <since> are not selected. Uncommitted changes are still included. In a shallow clone that lacks the merge base, pnpm compares against <since> directly.

This selector requires Git 2.24 or newer.

A project also counts as changed when:

  • a version it takes from a catalog changes in pnpm-workspace.yaml;
  • files were moved out of it and git detects the move as a rename.

--fail-if-no-match#

Use this flag if you want the CLI to fail if no packages have matched the filters.

You may also set this permanently with a failIfNoMatch setting. --no-fail-if-no-match overrides failIfNoMatch: true for one command.

Excluindo#

Qualquer um dos seletores de filtro pode funcionar como operadores de exclusão quando tiver um "!" à esquerda de. In zsh (and possibly other shells), "!" should be escaped: \!.

For instance, this will run a command in all projects except for foo:

pnpm --filter=!foo <cmd>

And this will run a command in all projects that are not in the lib directory or below it:

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

Since v12.7.0, selectors are evaluated in the order they are given, so a later inclusion can bring back a project that an earlier exclusion removed:

pnpm --filter "!./packages/**" --filter @scope/core <cmd>

Multiplicidade#

When packages are filtered, every package is taken that matches at least one of the inclusion selectors, unless a later exclusion removes it. When the first selector is an exclusion, filtering starts from every project in the workspace. Você pode usar quantos filtros quiser:

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

--filter-prod <filtering_pattern>#

Acts the same as --filter but omits devDependencies when selecting dependency projects from the workspace.

--test-pattern <glob>#

test-pattern allows detecting whether the modified files are related to tests. Se estiverem, os pacotes dependentes desses pacotes modificados não serão incluídos.

Esta opção é útil com o filtro "alterado desde". Por exemplo, o próximo comando executará testes em todos os pacotes alterados e, se as alterações estiverem no código-fonte do pacote, os testes também serão executados nos pacotes dependentes:

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

To set it for every command, use the testPattern setting in pnpm-workspace.yaml:

  • Default: []
  • Type: string[]

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

Permite ignorar arquivos alterados por padrões glob ao filtrar projetos alterados desde o commit/branch especificado.

Exemplos de uso:

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

To set it for every command, use the changedFilesIgnorePattern setting in pnpm-workspace.yaml:

  • Default: []
  • Type: string[]