Search
Write a publication
Pull to refresh

Comments 14

Простите, а чем этот Bazel так хорош, что нужно так срадать?

Об этом я писал здесь: https://habr.com/ru/company/joom/blog/718340/
Основная цель: сокращение времени сборки в несколько раз (до миграции среднее время на сборку было порядка 40 минут, после 12 минут).
При этом удалось оторвать кучу самопальных костылей и, в целом, сборка стала гораздо надёжнее.

это ж что там должно происходить чтобы оно собиралось 40 минут О_О

40 минут это был средний результат инкрементальной сборки на 7-ми машинках в параллель. По нашим прикидкам, на одной машинке с холодным кэшем должно было быть часов 15.
В основном это время уходило на линковку тестовых бинарей: каждый пакет с тестами собирается в отдельный исполняемый файл и на это уходит чудовищное количество времени и дискового пространства.
На втором месте собственно исполнение тестов.

Базель как демократия по Черчиллю - плохой, но все остальное еще хуже :)

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

В общем, много чего можно, но и ломает он тоже очень много чего. В контексте голанга, например, совсем ломает gopls и всю идею модулей, так что либо надо городить огороды с поддельным GOROOT, либо использовать интеллижопу IDE c поддержкой базеля, что гм, не всегда удобно.

Я так и не смог понять, как подружить IDE и Bazel...

Собственно из-за этого и пошли по пути, когда BUILD-файлы генерируются на базе исходного кода и go.mod-файлов, максимально повторяя go build-сборку.

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

Эта схема оказалась на удивление удачной:

  • разработчикам не нужно воевать с Bazel;

  • IDE работает как работало;

  • генераторы получают возможность генерировать зависящие от компиляции данные (в нашем случае mock-и);

  • если нужно, разработчик может использовать Bazel как для сборки, так и для запроса зависимостей через bazel query.

А вот тезис с поддельным GOROOT я не понял...

Поддельный GOROOT - это когда специально обученный костыль собирает все зависимости указанного пакета (пакетов) и в отдельной директории выстраивает окружения для голанга - создает go.mod, вендорит внешние зависимости, генерит все то, что генерируя базелем итд. В итоге с этим можно работать в любой иде, потому что gopls.

У интеллиж в принципе нормальный рабочий плагин для работы с базелем, умеет все что надо - и тесты запускать, и навигацию. Единственно что оооочень долго синкается проект. А у VSCode когда я в последний раз смотрел, все было достаточно печально с базелем

Видимо то, что билдится 40 минут

Распилить проект и уменьшить связанность кода это благая цель.
Но в данном случае:

  • уменьшение связанности никак не конфликтует с оптимизацией инструментария сборки;

  • уменьшение связанности кода никак нельзя назвать "простым" процессом.

Достаточно маленькие модули компилятся за секунду или меньше. И не нужно пересобирать все целиком. Распилить монолит - да, непросто, но это - инвестирование в правильном направлении. А тут какое то сокрытие симптомов нездорового процесса

Вы не представляете масштаб проблемы: распил проекта на маленькие модули требует годы.

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

К тому же сокращение времени на итерацию в CI делает рефакторинг заметно комфортнее.

Для небольших вещей достаточно go build/makefile/dockerfile

Sign up to leave a comment.