Facebook выпустил Yarn 1.0, пакетный менеджер для JavaScript
Спустя 11 месяцев после открытия кода Facebook представил первый стабильный релиз пакетного менеджера Yarn 1.0, предназначенного для управления зависимостями в проектах на языке JavaScript и вобравшего в себя опыт и лучшие идеи менеджеров зависимостей Bundler, Cargo и npm. Исходные тексты распространяются под лицензией BSD. Сборки подготовлены для macOS, Windows и Linux.
Yarn позиционируется как замена npm, способная работать с репозиториями npm, но обеспечивающая более высокий уровень производительности, надёжности и безопасности. Основными причинами создания нового пакетного менеджера стала невозможность избавления npm от ряда проблем без его кардинальной переработки. В частности, npm не обеспечивает постоянство установленных зависимостей для разных пользователей и систем. В зависимости от порядка установки пакетов, структура директории node_modules существенно отличается у разных пользователей, что приводит в возникновению ситуаций, в которых у одного пользователя всё может отлично работать, а у другого может проявляться ошибка. Кроме того, npm работает очень медленно и имеет архитектурные проблемы с безопасностью, связанные с автоматическим выполнением кода из пакетов.
Для достижения высокой производительности в Yarn применена техника кэширования всех загруженных пакетов, что позволяет исключить ситуации, в которых может потребоваться повторная загрузка. Для ускорения также применяется распараллеливание операций, что позволяет существенно сократить время установки пакетов. Надёжность обеспечивается благодаря применению файлов-блокировок для привязки зависимостей к определённой версии и детерминированному алгоритму установки, гарантирующему, что установленный пакет будет работать идентично на любых системах. Для поддержания безопасности в Yarn осуществляется проверка целостности каждого установленного пакета по контрольным суммам.
Основные возможности Yarn:
- Режим работы в offline: если пакет устанавливался ранее, то его повторная установка может быть осуществлена без наличия сетевого соединения;
- Идентичность зависимостей: на любых системах, независимо от порядка установки, будет установлен точно такой же набор зависимостей;
- Оптимизация сетевого взаимодействия: применяются эффективные алгоритмы группировки пакетов в очередь и обеспечения максимальной пропускной способности при загрузке данных;
- Стойкость к проблемам в сети: сбой выполнения одного запроса не приводит к прерыванию установки, в случае проблем запрос будет повторён;
- Возможность комбинирования реестров: можно устанавливать любые пакеты из репозиториев npm и Bower;
- Плоский режим: для избежания появления дубликатов в Yarn предусмотрен анализ заменяемости версий зависимостей — при несовпадении версии, определяется возможность использования уже установленной версии;
- Возможность создания фильтров лицензий, допускающих для установки только модули с заданными лицензиями;
- Наличие стабильного JavaScript API и абстрактной модели журналирования для упрощения интеграции с различными сборочными инструментариями;
- Минималистичный интерфейс командной строки.
Новшества, представленные в выпуске Yarn 1.0:
- Включены по умолчанию рабочие области (Workspaces), позволяющие автоматически агрегировать все зависимости из нескольких файлов package.json и дающие возможность установить всех их за один шаг или использовать для всех один файл-блокировку (yarn.lock);
- Добавлен механизм автоматического слияния изменений (auto-merge), позволяющий автоматически разрешать конфликты с yarn.lock, возникающие, когда в системе управления версиями несколько разработчиков добавляют в yarn.lock данные о разных зависимостях. Подобные конфликты теперь по возможности разрешаются в процессе выполнения команды «yarn install» и в результате создаётся новый yarn.lock, избавленный от конфликтов;
- Появились средства для выборочного определения версий, которые позволяют решить проблему с обновлением непрямых зависимостей. Например, в пакете может быть устранена важная ошибка или критическая уязвимость, но в текущем проекте этот пакет может использоваться не напрямую, а как зависимость у какого-то другого пакета. Раньше, пока не обновится этот другой пакет, не обновлялись и его зависимости. Теперь в package.json можно задать требуемые версии и для субзависимостей;
- Улучшен процесс интерактивного обновления;
- Ускорена проверка целостности файлов;
- Добавлен отдельный модуль для парсинга файлов блокировки.
© OpenNet