2008-10-13 9 views
13

Jestem odpowiedzialny za kilka (raczej małych) programów, które dzielą dużo kodu za pośrednictwem różnych bibliotek. Zastanawiam się, jaki jest najlepszy układ repozytorium, aby rozwinąć różne prorgramy (i biblioteki) i zachować synchronizację bibliotek we wszystkich programach.Układ repozytoriów Subversion dla bibliotek opracowanych w różnych programach

Dla argumentu powiedzmy istnieją dwa programy z dwóch bibliotek:

  • Program1
    • Library1
    • Library2
  • Program2.ldn
    • Library1
    • Library2

Naturalnie, poprawek i ulepszeń dla bibliotek powinny (ostatecznie) połączenie do wszystkich programów. Ponieważ biblioteki są opracowywane podczas pracy nad różnymi programami, korzystanie z externals definitions nie wchodzi w grę.

Więc myślałem, że traktuję moje biblioteki w każdym z wyjątkiem jednego miejsca jako vendor branches, ale nie jestem pewien, jaki byłby najlepszy układ.

Myślałam coś wzdłuż linii:

  • Bibliotek
    • Library1 (przodek)
    • Library2 (przodek)
  • Program1
    • kodowych Program1
    • Library1 (oddział sprzedawca)
    • Library2 (oddział sprzedawca)
  • ...

Wtedy powiedzieć przy opracowywaniu Program1 pewne zmiany są dokonywane na Library2, mogę połączyć je z powrotem do bibliotek część repozytorium i w razie potrzeby połączyć je ze wszystkimi pozostałymi programami.

Łączenie się z innymi programami nie zawsze może nastąpić natychmiast, osoby pracujące nad Programem 2 mogą być bliskie wydania, a raczej zakończyć je najpierw, utworzyć znacznik, a dopiero potem zaktualizować wszystkie biblioteki.

Jestem trochę zaniepokojony, że spowoduje to wiele fuzji i odrobinę bóle głowy konserwacji po pewnym czasie, ale naprawdę nie widzę o wiele lepszego rozwiązania.

To wydaje mi się dość powszechnym przypadkiem użycia, więc pomyślałem, że po prostu zapytam społeczność stackoverflow, jaki jest najlepszy układ repozytorium, aby to osiągnąć?

Odpowiedz

9

Cóż, wydaje mi się, że nie zgadzam się, że wykluczenie zewnętrzne nie wchodzi w grę. W przeszłości miałem podobny problem. Rozwiązałem go za pomocą zewnętrznych właściwości svn.

Tworzenie repozytoriów biblioteczne:

svnadmin create /path/library1 
svnadmin create /path/library2 
... 

Tworzenie repozytoriów klienta:

svnadmin create /path/program1 
svnadmin create /path/program2 
... 

Teraz deklarują bibliotek jako zewnętrzny w ramach repozytoriów Program:

cd /path/program1 
svn propset svn:externals "library1 svnpath://wherever/library1/trunk/" . 
svn propset svn:externals "library2 svnpath://wherever2/library2/trunk/" . 

Teraz możesz zrobić zmiany w programach 1 & 2 i dokonywanie zatwierdzeń w katalogu głównym tych projektów nie ma wpływu na biblioteki ... ale jeśli musisz wprowadzić zmiany w bibliotekach, możesz. Wtedy wtedy i tylko wtedy, gdy masz uprawnienia do zapisu do repozytoriów bibliotek, możesz również zatwierdzić te zmiany - ale tylko z podkatalogu biblioteki.

tj. tego nie robi commit do bibliotek ...

... make a change in /path/program1/library1 ... 
cd /path/program1 
svn commit -m "some change" 

To zobowiązuje zmiany dokonane w bibliotece powyżej:

cd /path/program1/library1 
svn commit -m "change to library code" 
+0

Dzięki za jasną, wyczerpującą odpowiedź, ale czy nie zmusiłoby to wszystkich zmian do bibliotek do wszystkich programów? Programy powinny mieć możliwość "zawieszenia się" do starszej wersji na jakiś czas, jeśli jest to pożądane (podczas gdy inne powinny być w stanie z powodzeniem zatwierdzić i pracować). Wyjaśniono nieco więcej. – Pieter

+2

Pieter, żadne zmiany w bibliotekach nie wymuszają zmian we wszystkich programach. Jeśli musisz "zawiesić się" na starszą wersję biblioteki, zewnętrzna wersja powinna być oznaczona tagami (lub konkretną wersją z użyciem --revision). Nawet jeśli wyewidencjonujesz bagażnik, zmiany nie muszą być wypychane. – paxos1977

1

Dlaczego źródło biblioteki musi istnieć w drzewie programu. Skompiluj swoje biblioteki osobno i połącz je z programami.

+1

Biblioteki są rozwijane podczas pracy nad programami ... – Pieter

+0

Okay ... więc masz oznaczone wydanie biblioteki, która NIE jest kodem rozwojowym i jest to, co łączysz ze swoim programem. –

Powiązane problemy