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: studioa player, i bibliotek zależnych core, graphoraz network, gdzie zależności są w następujący sposób:
corejest samodzielnygraphzależy odcore(podmoduł w./libs/core)networkzależy odcore(podmoduł w./libs/core)studiozależy odgraphinetwork(podmoduły./libs/graphi./libs/network)playerzależy odgraphinetwork(podmoduły./libs/graphi./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 studioi 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 coreklonowany jest dwukrotnie w studioprojekcie. Oprócz marnowania miejsca na dysku mam problem z kompilacją systemu, ponieważ buduję coredwa 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
graphinetworkpowiedz, 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 lokalnycorepodmoduł. - Wprowadź dodatkową zależność:
studiowłączonecore. Następniestudiobudujecore, ustawia zawierać ścieżkę do własnej kopiicorepodmodułem, a następnie budujegraphinetworkw 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 graphmoże również wymagać aktualizacji corei networkuzyskania kompatybilnej wersji corewe wszystkich projektach) .
Masz jakieś przemyślenia na ten temat?