Фільтрування

Фільтрування дозволяє обмежити команди певними підмножинами пакунків.

pnpm підтримує потужний синтаксис селектора для вибору пакунків за назвою або за звʼязком.

Селектори можна вказати за допомогою прапорця --filter (або -F):

pnpm --filter <package_selector> <command>

Зіставлення#

--filter <назва_пакунка>#

Щоб обрати конкретний пакунок, просто вкажіть його назву (@scope/pkg) або скористайтеся шаблоном для вибору набору пакунків (@scope/*).

Приклади:

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

Вказування області видимості пакунка не є обовʼязковим, тому --filter=core вибере @babel/core, якщо core не буде знайдено. Однак, якщо у робочому просторі є декілька пакунків з однаковими іменами (наприклад, @babel/core і @types/core), то фільтрація без області видимості нічого не виявить.

--filter <назва_пакунка>...#

Щоб вибрати пакунок та його залежності (прямі та непрямі), додайте до назви пакунка трикрапку: <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>

legacyDirFiltering#

  • Стандартно: false
  • Тип: 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>]"#

Вибирає всі пакунки, змінені після вказаного коміту/гілки. Може мати суфікс або префікс ... для включення залежностей/залежних.

Наприклад, наступна команда запустить тести у всіх змінених пакунках, починаючи з master, а також у всіх залежних пакунках:

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#

Використовуйте цей прапорець, якщо ви хочете, щоб CLI завершив роботу, якщо жоден пакунок не відповідає фільтрам.

Ви також можете встановити це назавжди за допомогою параметра failIfNoMatch.

Виключення#

Будь-який з селекторів фільтра може працювати як оператор виключення, якщо перед ним стоїть символ «!». У zsh (і, можливо, в інших оболонках) слід екранувати «!»: \!.

Наприклад, це призведе до виконання команди у всіх проєктах, окрім 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 &lt;filtering_pattern>#

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

--test-pattern <glob>#

test-pattern дозволяє визначити, чи повʼязані змінені файли з тестами. Якщо вони є, то залежні пакунки таких модифікованих пакунків не включаються.

Ця опція корисна з фільтром «змінено з». Наприклад, наступна команда запустить тести у всіх змінених пакунках, а якщо зміни відбулися у вихідному коді пакунка, тести буде запущено і у залежних пакунках:

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

--changed-files-ignore-pattern &lt;glob>#

Дозволяє ігнорувати змінені файли за шаблонами glob при фільтруванні змінених проєктів після вказаного комміту/гілки.

Приклад використання:

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