Facebook представил недавно выпустила новую систему сборки под названием «Buck2», в которой отмечается, что она ориентирован на сборку проектов из репозиториев очень большие, которые включают код на разных языках программирование.
Различия между новой реализацией и системой ранее использованный доллар Через facebook используют язык Rust вместо Java и существенное повышение эффективности и производительности процесса сборки (во внутренних тестах на той же инфраструктуре Buck2 выполняет сборочные задачи в два раза быстрее, чем Buck).
Системы сборки стоят между разработчиком и работающим кодом, поэтому все, что мы можем сделать, чтобы сделать процесс быстрее или продуктивнее, напрямую влияет на то, насколько эффективным может быть разработчик. Цель Buck2 заключалась в том, чтобы сохранить то, что нам нравилось в Buck1 (основы и рабочие процессы), вдохновиться инновациями после Buck1 (включая Bazel, Adapton и Shake) и сосредоточиться на скорости и предоставлении новых возможностей.
О Бак2
Подчеркивается, что система не привязана к созданию кода на конкретных языках и по умолчанию он поддерживает проекты компоновщика, написанные на C++, Python, Rust, Kotlin, Erlang, Swift, Objective-C, Haskell и OCaml, используемые Facebook.
Язык Starlark, основанный на Python (как и в Bazel), используется для разработки плагинов, создания скриптов и правил. Starlark позволяет расширить возможности системы сборки и абстрагироваться от конкретных языков, используемых в строящихся проектах.
Упоминается, что высокая производительность достигается за счет кэширования результатов, распараллеливание работы и поддержка удаленного выполнения задач (Remote Build Execution).
Среда сборки использует понятие «герметичность»: скомпилированный код оторван от внешнего мира, в процессе сборки ничего извне не загружается, а многократное выполнение задания на разных системах приводит к одному и тому же результату (повторные сборки, например, результата компиляции проекта на машина от разработчика будет точно такой же, как сборка на сервере непрерывной интеграции). Ситуация отсутствия зависимости воспринимается в Buck2 как баг.
Со стороны Основные характеристики Buck2, выделяются следующие:
- Правила поддержки языков программирования и системы сборки ядра полностью разделены. Правила написаны на языке Starlark, а инструментарий и реализация Starlark написаны на Rust.
- В системе сборки используется единый инкрементальный граф зависимостей (без staging), что позволяет увеличить глубину распараллеливания работы по сравнению с Buck и Bazel и избежать разного рода багов.
- Код Buck2, размещенный на GitHub, и правила поддержки языка программирования практически идентичны внутренней версии, используемой в инфраструктуре Facebook (единственные отличия — ссылка на версии компилятора и серверы сборки, используемые Facebook).
- Система сборки предназначена для интеграции с системами удаленного выполнения заданий, которые позволяют запускать задания на удаленных серверах. API удаленного выполнения совместим с Bazel и был протестирован на совместимость с Buildbarn и EngFlow.
- Предусмотрена интеграция с виртуальными файловыми системами, в которых представлено содержимое всего репозитория, но фактически работа ведется с реальной локальной частью части репозитория (разработчик видит репозиторий целиком, но только то, что требуется) файлы, к которым осуществляется доступ, извлекаются из репозитория). Поддерживаются VFS на основе EdenFS и Git LFS, которые используются Sapling.
Наконец, для тех, кто хочет узнать об этом больше, они должны знать, что код распространяется под лицензией Apache 2.0, и они могут ознакомиться с деталями. По следующей ссылке.