Фильтрация
Фильтрация позволяет ограничить команды определенными подмножествами пакетов.
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 <селектор пакета>^...
Чтобы выбрать ТОЛЬКО зависимости пакета (как прямые, так и непрямые), добавьте к имени вышеупомянутое многоточие, которому предшествует шеврон. Например, следующая команда запустит тесты foo
и всех его зависимостей:
pnpm --filter "foo^..." test
--filter ...<селектор пакета>
Чтобы выбрать пакет и его зависимые пакеты (прямые и непрямые), добавьте к имени пакета префикс с многоточием: ...<package_name>
. Например, это запустит тесты foo
всех зависимых от него пакетов:
pnpm --filter ...foo test
--filter "...^<селектор пакета>"
Чтобы выбрать ТОЛЬКО зависимые пакеты (прямые и непрямые), добавьте к имени пакета префикс с многоточием, за которым следует шеврон. Например, это запустит тесты для всех пакетов, зависящих от 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>]"
Выбирает все измененные пакеты с момента указанного commit/branch. Может иметь суффикс или префикс ...
для включения зависимостей/зависимых.
Например, следующая команда запустит тесты во всех измененных пакетах, начиная с master
и во всех зависимых пакетах:
pnpm --filter "...[origin/master]" test
Исключения
Любой из селекторов фильтра может работать как оператор исключения, если перед ним стоит "!". В zsh (и, возможно, в других оболочках) "!" следует экранировать: \!
.
Например, это будет выполнять команду во всех проектах, за исключением 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 при фильтрации измененных проектов, начиная с указанного commit/branch.
Пример использования:
pnpm --filter="...[origin/master]" --changed-files-ignore-pattern="**/README.md" run build