Пакетный менеджер pnpm давно завоевал признание разработчиков благодаря жестким ссылкам (Hard Links) и контентно-адресуемому глобальному хранилищу, которые экономят десятки гигабайт дискового пространства и в разы ускоряют установку зависимостей.
Однако в гигантских монорепозиториях на сотни пакетов узким местом часто становится не само скачивание модулей, а этап выполнения сборочных скриптов (Lifecycle Scripts: postinstall, build) в пайплайнах continuous integration.
Вышедший релиз pnpm 12.15.0 приносит долгожданные оптимизации именно для высоконагруженных CI-контуров и монорепозиториев.
Давай посмотрим на ключевые новшества версии 12.15.0.
Флаг --only-built: умная фильтрация сборки
В крупных монорепозиториях многие вспомогательные пакеты имеют нативные биндинги или требуют компиляции при установке. Раньше pnpm запускал сборку для всех пакетов, удовлетворяющих фильтру, даже если их исходники не менялись.
В версии 12.15.0 появился флаг --only-built в сочетании с фильтром по измененным файлам:
# Сборка только тех пакетов, которые изменились относительно ветки main
pnpm --filter "...[origin/main]" run build --only-built
Этот флаг заставляет pnpm анализировать дерево зависимостей и запускать скрипты только для тех модулей, у которых реально изменился контентный хеш или бинарные артефакты сборки. На наших замерах в CI это сократило время прогона тестов на 35%.
Расширение возможностей pnpmfile.cjs
Файл перехвата хуков pnpmfile.cjs — мощнейшее оружие архитектора монорепозитория. Он позволяет на лету модифицировать манифесты зависимостей, подменять версии и принудительно удалять уязвимые транзитивные модули.
В релизе 12.15.0 добавлен новый хук afterAllResolved:
// .pnpmfile.cjs — аудит зависимостей на этапе разрешения графа
module.exports = {
hooks: {
afterAllResolved(lockfile, context) {
// Проверяем, чтобы в графе не появилось устаревших версий критичных библиотек
for (const [pkgId, pkg] of Object.entries(lockfile.packages)) {
if (pkgId.startsWith('lodash@') && !pkgId.startsWith('lodash@4.17.21')) {
context.log(`Предупреждение: обнаружена устаревшая версия ${pkgId}`);
}
}
return lockfile;
},
},
};
Хук срабатывает один раз после того, как резолвер pnpm построил полный граф зависимостей, и позволяет выполнять валидацию политик безопасности компании до того, как начнется скачивание файлов на диск.
О том, как эволюционирует изоляция токенов и кэширование пакетов, мы ранее писали в материале о релизе pnpm 12.14.0 и изоляции нативных пакетов.
Тонкая настройка сетевого кэша
Также в 12.15.0 улучшена работа с приватными NPM-реестрами: добавлен параметр network-concurrency для ограничения одновременных сокетов к корпоративным Nexus/Verdaccio серверам, что предотвращает падение локальных прокси под пиковой нагрузкой CI-агентов.
Релиз 12.15.0 делает pnpm еще более быстрым и надежным инструментом для современной командной разработки.
