Facebook представил Yarn, новый пакетный менеджер для JavaScript

Компания Facebook представила новый пакетный менеджер Yarn, ориентированный на управления зависимостями в проектах на языке JavaScript. Yarn разработан совместно с инженерами из компаний Exponent, Google и Tilde, и вобрал в себя опыт и лучшие идеи менеджеров зависимостей Bundler, Cargo и npm. Исходные тексты распространяются под лицензией BSD. Сборки подготовлены для macOS, Windows и Linux.

Yarn позиционируется как замена npm, способная работать с репозиториями npm, но обеспечивающая более высокий уровень производительности, надёжности и безопасности. Основными причинами создания нового пакетного менеджера стала невозможность избавления npm от ряда проблем без его кардинальной переработки. В частности, npm не обеспечивает постоянство установленных зависимостей для разных пользователей и систем. В зависимости от порядка установки пакетов, структура директории node_modules существенно отличается у разных пользователей, что приводит в возникновению ситуаций, в которых у одного пользователя всё может отлично работать, а у другого может проявляться ошибка. Кроме того, npm работает очень медленно и имеет архитектурные проблемы с безопасностью, связанные с автоматическим выполнением кода из пакетов.

Для достижения высокой производительности в Yarn применена техника кэширования всех загруженных пакетов, что позволяет исключить ситуации, в которых может потребоваться повторная загрузка. Для ускорения также применяется распараллеливание операций, что позволяет существенно сократить время установки пакетов. Надёжность обеспечивается благодаря применению файлов-блокировок для привязки зависимостей к определённой версии и детерминированному алгоритму установки, гарантирующему, что установленный пакет будет работать идентично на любых системах. Для поддержания безопасности в Yarn осуществляется проверка целостности каждого установленного пакета по контрольным суммам.

Основные возможности:

  • Режим работы в offline: если пакет устанавливался ранее, то его повторная установка может быть осуществлена без наличия сетевого соединения;
  • Идентичность зависимостей: на любых системах, независимо от порядка установки, будет установлен точно такой же набор зависимостей;
  • Оптимизация сетевого взаимодействия: применяются эффективные алгоритмы группировки пакетов в очередь и обеспечения максимальной пропускной способности при загрузке данных;
  • Стойкость к проблемам в сети: сбой выполнения одного запроса не приводит к прерыванию установки, в случае проблем запрос будет повторён;
  • Возможность комбинирования реестров: можно устанавливать любые пакеты из репозиториев npm и Bower;
  • Плоский режим: для избежания появления дубликатов в Yarn предусмотрен анализ заменяемости версий зависимостей - при несовпадении версии, определяется возможность использования уже установленной версии;
  • Возможность создания фильтров лицензий, допускающих для установки только модули с заданными лицензиями;
  • Наличие стабильного JavaScript API и абстрактной модели журналирования для упрощения интеграции с различными сборочными инструментариями;
  • Минималистичный интерфейс командной строки.