フィルタリング

フィルタリングを使用すると、コマンドをの特定の一部のパッケージに制限できます。

pnpm はパッケージを名前またはリレーションで選択するための豊富なセレクタ構文をサポートしています。

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

pnpm --filter <package_selector> <command>

Matching#

--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/*).

例:

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

パターンを使用してルートパッケージを指定することもできます。

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

--filter <package_name>^...#

ルートパッケージを除いた、パッケージの (直接と間接の両方の) 依存関係のみを選択するには、パッケージ名の後ろ、前述の三点リーダの前にキャレットを付与します。 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>"#

パッケージの (直接および間接の) 依存のみを選択するには、パッケージ名の前に三点リーダーとそれに続くキャレットを付けます。 For instance, this will run tests for all packages dependent on foo:

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

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

プロジェクトに一致する、現在の作業ディレクトリからの相対的なグロブパターンです。

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

指定したディレクトリの下にあるすべてのプロジェクトを含めます。

これは、三点リーダーおよびキャレット演算子とともに使用して、依存 / 被依存関係を指定することができます。

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

It may also be combined with [<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>

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, since v11.24.0. Read as subtree matches they named every project below the root, so a recursive command under this setting selected nothing at all, and --workspace-root pulled in the whole workspace instead of the root alone (#14101).

--filter "[<since>]"#

指定されたコミット / ブランチ以降に変更されたすべてのパッケージを選択します。 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]" test

Since v11.28.0, pnpm compares against the commit where the current branch forked from <since> (their 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 change to a version in a catalog in pnpm-workspace.yaml selects the projects that use that catalog entry. A project that files were moved out of is selected when 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.

除外#

いずれのフィルタセレクタも、先頭に "!" がある場合は除外演算子として機能します。 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 v11.28.0, selectors are applied in the order they are given. An exclusion removes projects selected by the selectors before it, and an inclusion after it can add excluded projects back. When the first selector is an exclusion, it starts from every project in the workspace. For instance, this runs a command in a but in no other project under packages:

pnpm --filter="!./packages/**" --filter=a <cmd>

複数のフィルターを指定する#

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. 必要な数だけフィルターを使用できます。

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. もしそうであれば、そのような変更されたパッケージの依存パッケージは含まれません。

このオプションは、"changed since" フィルタと一緒に使うと便利です。例えば次のコマンドは、変更されたすべてのパッケージでテストを実行します。パッケージのソースコードに変更があった場合は、テストは依存パッケージでも実行されます。

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