Мой вопрос касается субпроектов и работы над ними вместе со своими зависимостями в базеле.
У меня есть проект c++, над которым я работаю. Назовите это проектом A.
Проект A зависит от 2 других, над которыми я работаю, B и C.
Проект B также зависит от проекта C.
поэтому он выглядит так.
A -> (B, C)
B -> (C)
C -> no external dependencies
Я хочу иметь возможность работать над этими тремя проектами параллельно, но я хочу сохранить их независимыми.
Я попробовал несколько способов настроить это:
Внешние зависимости от git в моем файле WORKSPACE. Здесь проблема в том, что когда я хочу внести в них изменения, как если бы они были одним большим проектом, они не синхронизируются. Рабочий процесс также неудобен, чтобы постоянно переключаться с каталогов, нажимать мой репозиторий, возвращаться к другому, и потенциально пытаться (если бэзел решает это сделать, все равно не знаю, как его заставить).
Git подмодулей и внешних зависимостей в репозитории. Здесь проблема в CLion или что-то, что я использую для перехода к ссылке, фактически получает ее ссылку из специально созданного кэша базы, где-то, а не фактическое репо, которое я хотел бы зафиксировать.
Git, когда подмодули - это просто пакеты, от которых я зависим. Это было бы моим любимым решением, но если я это сделаю, файлы BUILD в каждом из подмодулей (все хранятся в third_party или какой-либо другой каталог) являются недопустимыми, так как сами они зависят от внешних зависимостей. Например, проект B включает C как внешнюю зависимость NOT в рабочей области, в которой я работаю, но в этом рабочем пространстве C представляет собой пакет. Единственный способ, с помощью которого я могу справиться, - это переписать все файлы сборки для каждого пакета, в который включена библиотека Bazel. Это не кажется продуктивным.
Я знаю, что в google мы используем другую версию этого, и мы сохраняем все это во внутренней рабочей области, но для этого должно быть решение для bazel.
Для аналогичного --override_repository
использования (тестирование изменений сторонних зависимостей перед отправкой запроса на --override_repository
я использую рабочий процесс на основе --override_repository
. Это говорит Bazel не вытаскивать данный внешний репозиторий из Github, а вместо этого использовать копию на вашем локальном диск.
Например, в вашем случае у меня может быть этот макет:
> ls ~/git project_a project_b project_c
Я могу внести изменения внутри ~/git/project_b
а затем построить проект A следующим образом:
cd ~/git/project_b # edit files cd ~/git/project_a bazel build //... --override_repository com_github_username_project_b=$HOME/git/project_b
Вы также можете добавить строку build --override_repository name=/path/to/repo
в .bazelrc
но я предпочитаю не делать этого, чтобы я не отправлял код, зависящий от неопределенного изменения зависимостей.
Таким образом, общее решение, которое я нашел для работы, - создать monorepo и использовать такой инструмент, как copybara, для создания автономных выпусков каждого из пакетов.