Я большой поклонник подмодулей Git . Мне нравится иметь возможность отслеживать зависимость вместе с ее версией, чтобы вы могли выполнить откат к предыдущей версии вашего проекта и иметь соответствующую версию зависимости для безопасного и чистого построения. Более того, проще выпустить наши библиотеки как проекты с открытым исходным кодом, поскольку история библиотек отделена от истории приложений, которые зависят от них (и которые не будут открыты).
Я настраиваю рабочий процесс для нескольких проектов на работе, и мне было интересно, как было бы, если бы мы взяли этот подход немного в крайность вместо того, чтобы иметь один монолитный проект. Я быстро понял , что это потенциал может червей в самом деле с помощью суб-модулей.
Предположим, пара приложений: studio
и player
, и зависимые библиотеки core
, graph
и network
, где зависимости следующие:
core
автономныйgraph
зависит отcore
(подмодуль в./libs/core
)network
Зависит отcore
(подмодуль в./libs/core
)studio
зависит отgraph
иnetwork
(субмодули в./libs/graph
и./libs/network
)player
зависит отgraph
иnetwork
(субмодули в./libs/graph
и./libs/network
)
Предположим, что мы используем CMake, и у каждого из этих проектов есть модульные тесты и все работы. Каждый проект (включая studio
и player
) должен иметь возможность компилироваться отдельно для выполнения метрик кода, модульного тестирования и т. Д.
Дело в том, что рекурсивно git submodule fetch
, тогда вы получите следующую структуру каталогов:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/graph/
studio/libs/graph/libs/ (sub-module depth: 2)
studio/libs/graph/libs/core/
studio/libs/network/
studio/libs/network/libs/ (sub-module depth: 2)
studio/libs/network/libs/core/
Обратите внимание, что core
дважды клонируется в studio
проекте. Помимо этой траты дискового пространства у меня есть проблема с системой сборки, потому что я собираюсь core
дважды, и у меня потенциально могут быть две разные версии core
.
Вопрос
Как организовать подмодули так, чтобы получить версионную зависимость и автономную сборку без получения нескольких копий общих вложенных подмодулей?
Возможное решение
Если зависимость от библиотеки является чем-то вроде предположения (то есть в моде «известно, что она работает с версией X» или «официально поддерживается только версия X») и потенциальные зависимые приложения или библиотеки отвечают за сборку с любой версией, которая им нравится, тогда Я мог бы представить следующий сценарий:
- Соберите систему сборки
graph
иnetwork
скажите им, где найтиcore
(например, через компилятор включите путь). Определите две цели сборки: «автономный» и «зависимость», где «автономный» основан на «зависимости» и добавляет путь включения, указывающий на локальныйcore
подмодуль. - Ввести дополнительную зависимость:
studio
отcore
. Затем выполняетstudio
сборкуcore
, устанавливает путь включения для своей собственной копииcore
субмодуля, затем выполняет сборкуgraph
и находитсяnetwork
в режиме «зависимости».
Полученная структура папок выглядит следующим образом:
studio/
studio/libs/ (sub-module depth: 1)
studio/libs/core/
studio/libs/graph/
studio/libs/graph/libs/ (empty folder, sub-modules not fetched)
studio/libs/network/
studio/libs/network/libs/ (empty folder, sub-modules not fetched)
Тем не менее, для этого требуется некоторое волшебство системы сборки (я уверен, что это можно сделать с помощью CMake) и небольшая ручная работа со стороны обновлений версий (обновление graph
может также потребовать обновления core
и network
получения совместимой версии core
во всех проектах) ,
Есть мысли по этому поводу?