Я великий фанат підмодулів 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у всіх проектах) .
Будь-які думки з цього приводу?