Meta, одна из ведущих технологических компаний мира, представила Buck2 — новую открытую систему сборки масштаба предприятия, которая стала значительным шагом вперёд по сравнению с её предшественницей Buck1. Buck2 разработана с нуля, написана на языке Rust и ориентирована на значительное ускорение процессов сборки, повышение параллелизма и упрощение архитектуры. Более тысячи инженеров уже используют Buck2 внутри компании, осуществляя миллионы сборок ежедневно, и результаты впечатляют — скорость сборки выросла вдвое по сравнению с Buck1. Основная задача любой системы сборки — максимизировать продуктивность разработчиков, минимизируя время, которое они тратят на ожидание завершения компиляции и тестирования. В случае Meta, где огромные коды и проекты требуют максимальной оптимизации, Buck2 отвечает именно этим требованиям.
Эта система полностью переработана с целью устранить узкие места и повысить общую эффективность. Архитектура Buck2 отличается строгим разделением между ядром системы и языковыми правилами. Все правила, определяющие процессы сборки конкретных языков программирования, реализованы на Starlark, что повышает гибкость и упрощает их изменение и сопровождение. Само ядро, отвечающее за управление зависимостями и выполнением задач, написано на Rust для достижения максимальной производительности и безопасности. Такой подход ярко контрастирует с Buck1, где правила плотно интегрированы в ядро, а также с Bazel, где некоторые языковые правила жестко зашиты в систему.
Система сборки построена вокруг единого инкрементального графа зависимостей. Это позволяет избежать множественных фаз обработки, характерных для предыдущих систем, благодаря чему уменьшается вероятность ошибок и повышается параллелизм. Граф строится и обновляется при изменении исходных файлов или правил, и все вычисления зависят от ключей и значений в этом графе, что позволяет быстро пересобирать только те части проекта, которые действительно были затронуты изменениями. Особое внимание в Buck2 уделено API правил. Оно сочетает в себе возможности для высокой производительности и выразительности, поддерживая динамические зависимости и расширенные функции.
Это позволяет не только эффективно создавать стандартные правила, такие как сборка бинарников и библиотек, но и строить сложные последовательности задач без ущерба для скорости и надежности. Уникальная особенность — введение «транситивных множеств» (tsets), которые оптимизируют работу с зависимостями при построении сложных графов, например, в ситуациях со связыванием C++ библиотек, снижая потребление памяти и ускоряя вычисления. Buck2 тесно интегрирована с такими технологиями, как удалённое исполнение и виртуальные файловые системы. Возможности удалённого исполнения позволяют распределять выполнение сборочных задач по удалённым серверам, эффективно обрабатывая интенсивные задачи и ускоряя процесс сборки в масштабах больших репозиториев. Интеграция с виртуальными файловыми системами, например, Sapling, позволяет экономить место на диске, загружая только необходимые файлы по мере необходимости и при этом не теряя в скорости доступа.
Пользовательский опыт при работе с Buck2 значительно улучшен благодаря новой консоли на базе библиотеки Superconsole. Она предоставляет подробный и интуитивно понятный интерфейс вывода статуса сборки, полезный для мгновенного понимания текущего состояния процесса и устранения возможных проблем. Кроме того, в Buck2 реализован постоянный демон, поддерживающий единый граф зависимости в памяти, который уменьшает избыточную работу по пересозданию различных графов при каждом запуске команды, что ускоряет повторные сборки. Для разработчиков правил переход на Buck2 означает возможность реализовывать логики сборки гибко и безопасно. Например, сложные внутренние зависимости в проектах на OCaml, которые нелегко выразить традиционными способами, теперь динамически вычисляются с помощью новой примитивной функции dynamic_output, которая запускает внешние команды, считывает результаты и автоматически корректирует зависимости.
Buck2 создана с учетом опыта и лучших практик, накопленных в прошлом десятилетии многими системами сборки, включая Bazel, Adapton и Shake. Однако она существенно развивается в сторону увеличения скорости, параллелизма и более чистого и модульного дизайна. Открытый доступ к коду на GitHub, а также предоставление отдельных компонентов как библиотек, позволяет сообществу использовать и развивать отдельные части системы, не привязываясь к Buck2 целиком. Meta ориентируется на широкое применение Buck2 в среде многоплатформенных проектов среднего и большого масштаба. Упрощение архитектуры и прирост производительности дают инженерам возможность быстрее вносить изменения и реализовывать новые функции, снижая время ожидания и повышая общую эффективность командной разработки.