Вопросы-Ответы

Если у вас есть вопросы или вам нужна поддержка, см. Получение справки .

Что такое Базель?

Bazel — это инструмент, который автоматизирует сборку и тестирование программного обеспечения. Поддерживаемые задачи сборки включают запуск компиляторов и компоновщиков для создания исполняемых программ и библиотек, а также сборку развертываемых пакетов для Android, iOS и других целевых сред. Bazel похож на другие инструменты, такие как Make, Ant, Gradle, Buck, Pants и Maven.

Что особенного в Базеле?

Bazel был разработан, чтобы соответствовать тому, как разрабатывается программное обеспечение в Google. Он имеет следующие особенности:

  • Многоязычная поддержка: Bazel поддерживает множество языков и может быть расширен для поддержки произвольных языков программирования.
  • Язык сборки высокого уровня: проекты описываются на языке BUILD , кратком текстовом формате, описывающем проект как наборы небольших взаимосвязанных библиотек, двоичных файлов и тестов. Напротив, с такими инструментами, как Make, вы должны описывать отдельные файлы и вызовы компилятора.
  • Поддержка нескольких платформ: один и тот же инструмент и одни и те же файлы BUILD можно использовать для создания программного обеспечения для разных архитектур и даже разных платформ. В Google мы используем Bazel для создания всего: от серверных приложений, работающих в системах в наших центрах обработки данных, до клиентских приложений, работающих на мобильных телефонах.
  • Воспроизводимость: в файлах BUILD каждая библиотека, тест и двоичный файл должны полностью указывать свои прямые зависимости. Bazel использует эту информацию о зависимостях, чтобы знать, что необходимо перестроить при внесении изменений в исходный файл и какие задачи могут выполняться параллельно. Это означает, что все сборки являются добавочными и всегда будут давать один и тот же результат.
  • Масштабируемость: Bazel может обрабатывать большие сборки; в Google двоичный файл сервера обычно имеет 100 000 исходных файлов, а сборка, в которой файлы не были изменены, занимает около ~ 200 мс.

Почему Google не использует...?

  • Make, Ninja: эти инструменты дают очень точный контроль над тем, какие команды вызываются для создания файлов, но пользователь должен написать правильные правила.
    • Пользователи взаимодействуют с Bazel на более высоком уровне. Например, Bazel имеет встроенные правила для «теста Java», «бинарного файла C++» и таких понятий, как «целевая платформа» и «хост-платформа». Эти правила были проверены в бою, чтобы быть надежными.
  • Ant и Maven: Ant и Maven в первую очередь ориентированы на Java, а Bazel работает с несколькими языками. Bazel поощряет разделение баз кода на более мелкие повторно используемые единицы и может перестраивать только те, которые нуждаются в перестроении. Это ускоряет разработку при работе с большими кодовыми базами.
  • Gradle: файлы конфигурации Bazel гораздо более структурированы, чем файлы Gradle, что позволяет Bazel точно понимать, что делает каждое действие. Это обеспечивает больший параллелизм и лучшую воспроизводимость.
  • Штаны, Бак: оба инструмента были созданы и разработаны бывшими сотрудниками Google в Twitter, Foursquare и Facebook соответственно. Они были смоделированы по образцу Bazel, но их наборы функций отличаются, поэтому они не являются для нас жизнеспособной альтернативой.

Откуда взялся Базель?

Bazel — это разновидность инструмента, который Google использует для внутреннего создания своего серверного программного обеспечения. Он расширился и для создания другого программного обеспечения, такого как мобильные приложения (iOS, Android), которые подключаются к нашим серверам.

Вы переписали свой внутренний инструмент с открытым исходным кодом? Это вилка?

Bazel делится большей частью своего кода с внутренним инструментом, и его правила используются для миллионов сборок каждый день.

Зачем Google создал Bazel?

Давным-давно Google создавал свое программное обеспечение, используя большие сгенерированные файлы Makefile. Это привело к медленным и ненадежным сборкам, что стало мешать производительности наших разработчиков и гибкости компании. Bazel был способом решить эти проблемы.

Требуется ли для Bazel кластер сборки?

Bazel по умолчанию запускает операции сборки локально. Однако Bazel также может подключаться к кластеру сборки для еще более быстрой сборки и тестирования. Дополнительные сведения см. в нашей документации по удаленному выполнению и кэшированию, а также удаленному кэшированию .

Как работает процесс разработки Google?

Для нашей базы кода сервера мы используем следующий рабочий процесс разработки:

  • Весь код нашего сервера находится в единой гигантской системе контроля версий.
  • Все создают свое программное обеспечение с помощью Bazel.
  • Разные команды владеют разными частями исходного дерева и делают свои компоненты доступными в качестве целей BUILD .
  • Ветвление в основном используется для управления выпусками, поэтому каждый разрабатывает свое программное обеспечение в головной версии.

Bazel является краеугольным камнем этой философии: поскольку Bazel требует, чтобы все зависимости были полностью указаны, мы можем предсказать, какие программы и тесты затронуты изменением, и проверить их перед отправкой.

Дополнительную информацию о процессе разработки в Google можно найти в блоге eng tools .

Почему вы открыли Базель?

Создание программного обеспечения должно быть веселым и легким. Медленные и непредсказуемые сборки лишают программирование удовольствия.

Почему я хочу использовать Bazel?

  • Bazel может сократить время сборки, поскольку он может перекомпилировать только те файлы, которые необходимо перекомпилировать. Точно так же он может пропустить повторный запуск тестов, которые, как ему известно, не изменились.
  • Bazel дает детерминированные результаты. Это устраняет перекос между инкрементными и чистыми сборками, ноутбуком и системой CI и т. д.
  • Bazel может создавать различные клиентские и серверные приложения с помощью одного и того же инструмента в одной и той же рабочей области. Например, вы можете изменить клиент-серверный протокол за одну фиксацию и проверить, работает ли обновленное мобильное приложение с обновленным сервером, создав оба приложения с помощью одного и того же инструмента, воспользовавшись всеми вышеупомянутыми преимуществами Bazel.

Можно посмотреть примеры?

Да; см. простой пример или прочитайте исходный код Bazel для более сложного примера.

В чем Базель лучше?

Bazel отлично подходит для создания и тестирования проектов со следующими свойствами:

  • Проекты с большой кодовой базой
  • Проекты, написанные на (нескольких) скомпилированных языках
  • Проекты, развертываемые на нескольких платформах
  • Проекты, прошедшие обширные тесты

Где я могу запустить Базель?

Bazel работает на Linux, macOS (OS X) и Windows.

Перенос на другие платформы UNIX должен быть относительно простым, если для этой платформы доступен JDK.

Для чего мне не следует использовать Bazel?

  • Bazel пытается быть умным в кэшировании. Это означает, что он не подходит для выполнения операций сборки, выходные данные которых не должны кэшироваться. Например, следующие шаги не следует запускать из Bazel:
    • Этап компиляции, который извлекает данные из Интернета.
    • Шаг тестирования, который подключается к экземпляру QA вашего сайта.
    • Шаг развертывания, который изменяет облачную конфигурацию вашего сайта.
  • Если ваша сборка состоит из нескольких длинных последовательных шагов, Bazel вряд ли сможет вам помочь. Вы получите больше скорости, разбивая длинные шаги на более мелкие, дискретные цели, которые Bazel может выполнять параллельно.

Насколько стабилен набор функций Bazel?

Основные функции (C++, Java и правила оболочки) широко используются в Google, поэтому они тщательно протестированы и имеют очень небольшой отток. Точно так же мы ежедневно тестируем новые версии Bazel на сотнях тысяч целевых объектов, чтобы найти регрессии, и выпускаем новые версии несколько раз в месяц.

Короче говоря, за исключением функций, помеченных как экспериментальные, Bazel должен просто работать. Изменения в неэкспериментальных правилах будут обратно совместимыми. Более подробный список статусов поддержки функций можно найти в нашем документе поддержки .

Насколько стабилен Bazel как бинарный файл?

Внутри Google мы следим за тем, чтобы сбои Bazel происходили очень редко. Это также должно относиться к нашей кодовой базе с открытым исходным кодом.

Как я могу начать использовать Базель?

См. Начало работы .

Разве Docker не решает проблемы воспроизводимости?

С помощью Docker можно легко создавать песочницы с фиксированными выпусками ОС, например, Ubuntu 12.04, Fedora 21. Это решает проблему воспроизводимости для системной среды — то есть «какая версия /usr/bin/c++ мне нужна?»

Docker не обеспечивает воспроизводимость изменений в исходном коде. Запуск Make с несовершенно написанным Makefile внутри контейнера Docker может привести к непредсказуемым результатам.

Внутри Google мы проверяем инструменты в системе контроля версий на воспроизводимость. Таким образом, мы можем проверять изменения в инструментах («обновить GCC до 4.6.1») с помощью того же механизма, что и изменения в базовых библиотеках («исправить проверку границ в OpenSSL»).

Могу ли я создавать двоичные файлы для развертывания в Docker?

С помощью Bazel вы можете создавать автономные статически скомпонованные двоичные файлы на C/C++ и автономные файлы jar для Java. Они работают с небольшим количеством зависимостей от обычных систем UNIX, и поэтому должны быть простыми для установки внутри контейнера Docker.

В Bazel есть соглашения для структурирования более сложных программ, например, программы Java, которая использует набор файлов данных или запускает другую программу как подпроцесс. Такие среды можно упаковать в виде автономных архивов, чтобы их можно было развернуть в разных системах, включая образы Docker.

Могу ли я создавать образы Docker с помощью Bazel?

Да, вы можете использовать наши правила Docker для создания воспроизводимых образов Docker.

Будет ли Bazel автоматически воспроизводить мои сборки?

Для двоичных файлов Java и C++ да, если вы не меняете цепочку инструментов. Если у вас есть этапы сборки, включающие пользовательские рецепты (например, выполнение двоичных файлов с помощью сценария оболочки внутри правила), вам потребуется проявить дополнительную осторожность:

  • Не используйте зависимости, которые не были объявлены. Выполнение в песочнице (–spawn_strategy=sandboxed, только в Linux) может помочь найти необъявленные зависимости.
  • Избегайте хранения временных меток и идентификаторов пользователей в сгенерированных файлах. ZIP-файлы и другие архивы особенно подвержены этому.
  • Избегайте подключения к сети. Выполнение в песочнице также может помочь здесь.
  • Избегайте процессов, использующих случайные числа, в частности, обход словаря рандомизирован во многих языках программирования.

У вас есть бинарные релизы?

Да, вы можете найти бинарные файлы последних выпусков и ознакомиться с нашей политикой выпуска .

Я использую Eclipse/IntelliJ/XCode. Как Bazel взаимодействует с IDE?

Для IntelliJ ознакомьтесь с плагином IntelliJ with Bazel .

Для XCode проверьте Tulsi .

Для Eclipse ознакомьтесь с плагином E4B .

Для других IDE ознакомьтесь с записью в блоге о том, как работают эти плагины.

Я использую Jenkins/CircleCI/TravisCI. Как Bazel взаимодействует с системами CI?

Bazel возвращает ненулевой код выхода, если вызов сборки или теста завершился неудачно, и этого должно быть достаточно для базовой интеграции CI. Поскольку Bazel не нуждается в чистых сборках для корректности, система CI не должна быть настроена на очистку перед запуском сборки/тестового прогона.

Более подробная информация о кодах выхода содержится в Руководстве пользователя .

Какие будущие функции мы можем ожидать в Базеле?

Смотрите наши дорожные карты .

Могу ли я использовать Bazel для моего проекта INSERT LANGUAGE HERE?

Базель является расширяемым. Любой может добавить поддержку новых языков. Поддерживаются многие языки, см. список рекомендаций в энциклопедии сборки, а более полный список — на сайте awesomebazel.com .

Если вы хотите разработать расширения или узнать, как они работают, см. документацию по расширению Bazel .

Могу ли я внести свой вклад в кодовую базу Bazel?

Ознакомьтесь с нашими рекомендациями по взносам .

Почему не все разработки ведутся открыто?

Нам по-прежнему приходится часто реорганизовывать интерфейсы между общедоступным кодом в Bazel и нашими внутренними расширениями. Это затрудняет разработку в открытом доступе.

Вы закончили с открытым исходным кодом Bazel?

Bazel с открытым исходным кодом находится в стадии разработки. В частности, мы все еще работаем над открытым исходным кодом:

  • Многие из наших модульных и интеграционных тестов (что должно облегчить внесение исправлений).
  • Полная интеграция с IDE.

Помимо кода, мы хотели бы, чтобы в конечном итоге все обзоры кода, отслеживание ошибок и решения по дизайну принимались публично с участием сообщества Bazel. Мы еще не там, поэтому некоторые изменения просто появятся в репозитории Bazel без внятного объяснения. Несмотря на это отсутствие прозрачности, мы хотим поддерживать внешних разработчиков и сотрудничать. Таким образом, мы открываем код, хотя часть разработки все еще происходит внутри Google. Пожалуйста, дайте нам знать, если что-то кажется неясным или необоснованным, поскольку мы переходим на открытую модель.

Есть ли части Bazel, исходный код которых никогда не будет открытым?

Да, часть кодовой базы либо интегрируется со специфическими технологиями Google, либо мы искали предлог, чтобы избавиться от нее (или это комбинация того и другого). Эти части базы кода недоступны на GitHub и, вероятно, никогда не будут доступны.

Как мне связаться с командой?

Мы доступны по адресу bazel-discuss@googlegroups.com.

Куда сообщать об ошибках?

Откройте вопрос на GitHub .

Что случилось со словом «Blaze» в кодовой базе?

Это внутреннее имя инструмента. Пожалуйста, обращайтесь к Bazel как к Bazel.

Почему в других проектах Google (Android, Chrome) используются другие инструменты сборки?

До первого (альфа) выпуска Bazel не был доступен извне, поэтому проекты с открытым исходным кодом, такие как Chromium и Android, не могли его использовать. Кроме того, первоначальное отсутствие поддержки Windows было проблемой для создания приложений Windows, таких как Chrome. Поскольку проект созрел и стал более стабильным, проект Android с открытым исходным кодом находится в процессе миграции на Bazel.

Как произносится «Базель»?

Так же, как «базилик» (трава) в американском английском: «BAY-zel». Оно рифмуется со словом «лещина». МФА: /ˈbeɪzˌəl/