メインコンテンツまでスキップ
Version: Next

フィルタリング

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

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

セレクターは --filter (または -F) フラグで指定できます:

pnpm --filter <package_selector> <command>

Matching

--filter <package_name>

完全に一致するパッケージを選択するには、その名前 (@scope/pkg) を指定してください。 もしくは、パターンを使用してパッケージすべてを選択できます (@scope/*) 。

例:

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

パッケージのスコープを指定するのは任意なので、 --filter=corecore が見つからなければ @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 自身を除いたすべての foo 依存関係についてテストを実行します。

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

--filter ...<package_name>

パッケージとその (直接および間接の) 依存を選択するには、パッケージ名の前に三点リーダーを付与します。 ...<package_name>。 例えば次のコマンドは、 foo とそれに依存するすべてのパッケージのテストを実行します。

pnpm --filter ...foo test

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

パッケージの (直接および間接の) 依存のみを選択するには、パッケージ名の前に三点リーダーとそれに続くキャレットを付けます。 例えば次のコマンドは、 foo 自身を除いたすべての 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>

また、 [<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

Added in: v8.13.1

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

除外

いずれのフィルタセレクタも、先頭に "!" がある場合は除外演算子として機能します。 zsh(およびおそらく他のシェル)では、"!" はエスケープする必要があります: \!

次の例は、 foo を除くすべてのプロジェクトでコマンドが実行されます。

pnpm --filter=!foo <cmd>

そして、次の例は lib ディレクトリの下にないすべてのプロジェクトでコマンドを実行します:

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

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

フィルタリングをする際は、少なくとも 1 つのフィルターに一致するすべてのパッケージが取得されます。 必要な数だけフィルターを使用できます。

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

--filter-prod <filtering_pattern>

--filter と同じ動作をしますが、ワークスペースから依存プロジェクトを選択する際には、 devDependencies は除外されます。

--test-pattern <glob>

test-pattern を使用すると、変更されたファイルがテストに関連しているかどうかを検出することができます。 もしそうであれば、そのような変更されたパッケージの依存パッケージは含まれません。

このオプションは、"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