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