Макс Хауэлл (Max Howell), автор популярной на платформе macOS системы управления пакетами brew (Homebrew), развивает новый пакетный менеджер Tea, позиционируемый как продолжение развития brew, выходящее за рамки пакетного менеджера и предлагающее унифицированную инфраструктуру управления пакетами, работающую с децентрализованными репозиториями. Проект изначально развивается как многоплатформенный (в настоящее время поддерживаются macOS и Linux, в разработке поддержка Windows). Код проекта написан на языке TypeScript и распространяется под лицензией Apache 2.0 (brew был написан на Ruby и поставлялся под лицензией BSD).
Tea концептуально не походит на традиционные пакетные менеджеры и вместо парадигмы “я хочу установить пакет” использует принцип “я хочу использовать пакет”. В частности, в Tea нет как таковой команды для установки пакета, вместо которой применяется формирование окружения для выполнения содержимого пакета, не пересекающегося с текущей системой. Пакеты размещаются в отдельном каталоге ~/.tea и не привязываются к абсолютным путям (могут быть перемещены).
Предоставляется два основных режима работы: переход в командную оболочку с доступом к окружению с установленными пакетами и прямой вызов связанных с пакетом команд. Например, при выполнении “tea +gnu.org/wget” пакетный менеджер загрузит утилиту wget и все необходимые зависимости, после чего предоставит shell-доступ в окружении, в котором доступна установленная утилита wget. Второй вариант подразумевает прямой запуск – “tea +gnu.org/wget wget https://some_webpage”, при котором будет установлена утилита wget и сразу запущена в отдельном окружении. Возможна компоновка сложных цепочек, например, для загрузки файла white-paper.pdf и его обработки утилитой glow можно использовать следующую конструкцию (если wget и glow отсутствуют, они будут установлены):
tea +gnu.org/wget wget -qO- https://tea.xyz/white-paper.pdf | tea +charm.sh/glow glow –
или можно использовать более простой синтаксис: tea -X wget -qO- tea.xyz/white-paper | tea -X glow –
Похожим образом можно напрямую запускать скрипты, примеры кода и однострочники, автоматически подгружая необходимый для их работы инструментарий. Например, выполнение “tea https://gist.githubusercontent.com/i0bj/…/raw/colors.go –yellow” приведёт к установке инструментария языка Go и выполнению скрипта colors.go с аргументом “–yellow”.
Чтобы не вызывать команду tea каждый раз предоставляется возможность её подключения как универсального менеджера виртуальных окружений и обработчика отсутствующих программ. В этом случае если запущенная программа недоступна, она будет установлена, а если устанавливалась ранее – запущена в своём окружении.
$ deno zsh: command not found: deno $ cd my-project $ deno tea: installing deno.land^1.22 deno 1.27.0 > ^D
В текущем виде доступные для Tea пакеты собраны в двух коллекциях – pantry.core и pantry.extra, которые включают метаданные, описывающие источники загрузки пакетов, сценарии сборки и зависимости. Коллекция pantry.core включает основные библиотеки и утилиты, поддерживаемые в актуальном виде и протестированные разработчиками Tea. В pantry.extra помещаются пакеты, предлагаемые представителями сообщества. Для навигации по пакетам предоставлен web-интерфейс.
Процесс создания пакетов для Tea сильно упрощён и сводится к созданию одного универсального файла package.yml (пример), не требующего адаптации пакета для каждой новой версии. Для обнаружения новых версий и для загрузки их кода пакет может ссылаться на GitHub. В файле также описываются зависимости и приводятся сценарии сборки для поддерживаемых платформ. Устанавливаемые пакеты неизменяемы (фиксируется версия), что исключает повторение ситуаций, похожих на инцидент с left-pad.
В дальнейшем планируется создание децентрализованных репозиториев, не привязанных к какому-то отдельному хранилищу и использующему для метаданных распределённый блокчейн, а для хранения пакетов децентрализованное хранилище. Релизы будут заверяться напрямую сопровождающими, а не третьими лицами, не связанными с основными проектами.