Дайджесты новостей
Кинематографичный вид сверху Flat Lay: рабочий стол DevOps-инженера с монорепозиторием pnpm 12.15.0, флагом --only-built и гранулярным кэшем.

Релиз pnpm 12.15.0: новые флаги сборки и тонкая настройка кэша

Пакетный менеджер 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 еще более быстрым и надежным инструментом для современной командной разработки.