Jestem wielkim fanem podmodułów Git . Lubię być w stanie śledzić zależność wraz z jej wersją, abyś mógł przywrócić poprzednią wersję swojego projektu i mieć odpowiednią wersję zależności, aby zbudować bezpiecznie i czysto. Co więcej, łatwiej jest wydać nasze biblioteki jako projekty open source, ponieważ historia bibliotek jest odrębna od historii aplikacji, które od nich zależą (i które nie będą otwarte).
Konfiguruję przepływ pracy dla wielu projektów w pracy i zastanawiałem się, jak by to było, gdybyśmy przyjęli to podejście trochę ekstremalnie zamiast jednego projektu monolitycznego. Szybko zdałem sobie sprawę, że istnieje potencjalna puszka robaków, które naprawdę wykorzystują podmoduły.
Przypuśćmy parę wniosków: studio
a player
, i bibliotek zależnych core
, graph
oraz network
, gdzie zależności są w następujący sposób:
core
jest samodzielnygraph
zależy odcore
(podmoduł w./libs/core
)network
zależy odcore
(podmoduł w./libs/core
)studio
zależy odgraph
inetwork
(podmoduły./libs/graph
i./libs/network
)player
zależy odgraph
inetwork
(podmoduły./libs/graph
i./libs/network
)
Załóżmy, że korzystamy z CMake i że każdy z tych projektów ma testy jednostkowe i wszystkie prace. Każdy projekt (w tym studio
i player
) musi mieć możliwość samodzielnej kompilacji w celu wykonywania pomiarów kodu, testowania jednostkowego itp.
Chodzi o to, że rekurencyjne git submodule fetch
, a następnie masz następującą strukturę katalogów:
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/
Zauważ, że core
klonowany jest dwukrotnie w studio
projekcie. Oprócz marnowania miejsca na dysku mam problem z kompilacją systemu, ponieważ buduję core
dwa razy i potencjalnie otrzymuję dwie różne wersje core
.
Pytanie
Jak zorganizować podmoduły, aby uzyskać zależną od wersji zależność i samodzielną kompilację bez uzyskiwania wielu kopii wspólnych zagnieżdżonych podmodułów?
Możliwe rozwiązanie
Jeśli zależność od biblioteki jest w pewnym sensie sugestią (tj. Jest „znana z pracy z wersją X” lub „tylko oficjalnie obsługiwana jest wersja X”), a potencjalnie zależne aplikacje lub biblioteki są odpowiedzialne za tworzenie z dowolną wersją, którą lubią, to Mogę sobie wyobrazić następujący scenariusz:
- Poproś system kompilacji
graph
inetwork
powiedz, gdzie mają znaleźćcore
(np. Za pomocą kompilatora zawierają ścieżkę). Zdefiniuj dwa cele kompilacji, „autonomiczny” i „zależność”, gdzie „samodzielny” jest oparty na „zależności” i dodaje ścieżkę dołączania, aby wskazywać na lokalnycore
podmoduł. - Wprowadź dodatkową zależność:
studio
włączonecore
. Następniestudio
budujecore
, ustawia zawierać ścieżkę do własnej kopiicore
podmodułem, a następnie budujegraph
inetwork
w trybie „zależność”.
Wynikowa struktura folderów wygląda następująco:
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)
Wymaga to jednak pewnej magii systemu kompilacji (jestem pewien, że można to zrobić za pomocą CMake) i trochę ręcznej pracy przy aktualizacjach wersji (aktualizacja graph
może również wymagać aktualizacji core
i network
uzyskania kompatybilnej wersji core
we wszystkich projektach) .
Masz jakieś przemyślenia na ten temat?