Я большой поклонник подмодулей 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во всех проектах) ,
Есть мысли по этому поводу?