Czy dobrą praktyką jest używanie oddziałów do utrzymywania różnych wydań tego samego oprogramowania?


72

Mamy produkt, który ma kilka różnych wydań. Różnice są niewielkie: różne ciągi tu i tam, bardzo mało dodatkowej logiki w jednej, bardzo mała różnica w logice w drugiej. Podczas opracowywania oprogramowania do każdej edycji należy dodać większość zmian; jest jednak kilka takich, które się nie różnią, i kilka, które muszą się różnić. Czy jest to poprawne użycie gałęzi, jeśli mam gałęzie release-editionA i release-editionB (..etc)? Czy są jakieś problemy? Dobre praktyki?

Aktualizacja: Dziękujemy za wgląd wszystkim, wiele dobrych odpowiedzi tutaj. Ogólny konsensus wydaje się być taki, że używanie gałęzi do tego celu jest złym pomysłem. Dla każdego, kto zastanawia się, moim ostatecznym rozwiązaniem problemu jest uzewnętrznienie ciągów jako konfiguracji i uzewnętrznienie odmiennej logiki jako wtyczek lub skryptów.


Odpowiedzi:


45

Zależy to od wielkości zmiany, ale nie uważam tego za dobrą praktykę w odniesieniu do różnic, które opisałeś.

Ogólnie rzecz biorąc, chcesz, aby gałąź Git była czymś, co zostanie scalone w przyszłości lub zapisane tylko do odczytu w celach informacyjnych. Git, które współistnieją w nieskończoność, oznacza pracę dla wszystkich: zmiany muszą być propagowane i łączone, konflikty rozwiązywane, cała zabawa. Co więcej, każdy programista musi pamiętać o wprowadzeniu zmian do pięciu repozytoriów zamiast do jednego.

Jeśli masz małe zmiany, cały proces łączenia i prowadzenia oddziałów wydaje się przesadny w porównaniu do problemu. Użyj swojego preprocesora lub systemu kompilacji, aby rozróżnić wersje. Czy proste #ifdefrozwiązuje problem? Więc nie rozwiązuj problemów z git, to przesada.


4
Powiedziałbym, że jest to poprawne w przypadku git, ale warto zauważyć, że w przypadku innych rozgałęzień VCS dla wydań / edycji lepsza strategia może być
jk.

16

Nie do tego naprawdę służą gałęzie. Oddziały powinny być krótkimi lub średnioterminowymi ścieżkami bocznymi do linii rozwoju, a nie długoterminowymi równoległymi wersjami tego samego kodu.

Umieściłbym wszystkie różne wersje w tym samym oddziale, z podkatalogami części, które różnią się między edycjami, i skonfigurowałem proces kompilacji (masz kompilację automatyczną, prawda?), Aby mogła ona wypisać dowolną edycję na żądanie (lub wszystkie jednocześnie).

W końcu chcesz zachować „pojedyncze źródło prawdy”; z gałęziami będziesz kopiować część kodu, ale nie wszystkie, a pewne połączenia w rzeczywistości popsułyby konfigurację.


Jeśli istnieją dwie wersje tej samej klasy z niewielkimi różnicami, w jaki sposób pomogłaby w tym automatyczna kompilacja? Jedynym rozwiązaniem, które przychodzi mi do głowy to, że stosując różne konfiguracje Solution ( EditionA, EditionBetc.) i tym tego rodzaju zajęciach warunkowo w csprojplikach (np <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'EditionA|AnyCPU' ">). Zautomatyzowane kompilacje mogą wykorzystywać te różne konfiguracje do budowania projektu. Co myślisz?
sotn

Zależy to od tego, jakich narzędzi budowania używasz, ale ogólnie rzecz biorąc, tak, powinieneś mieć sposób, aby powiedzieć systemowi kompilacji, którą konfigurację chcesz, a następnie powinien automatycznie dołączyć poprawny kod. Nie robiłem nic .NET od lat, więc nie wiem, co jest obecnie uważane za właściwy sposób.
tdammers

12

Jednym z rozwiązań - jak zauważyli ludzie - jest skonfigurowanie systemu kompilacji do obsługi różnych wydań.

Zastanowiłbym się również nad jego wdrożeniem jako przełączaniem funkcji i skorzystaniem z pliku konfiguracyjnego. Im mniej musisz budować, tym lepiej.

Zajrzyj na tę stronę.


3

Sądzę, że to dobry pomysł, pod warunkiem, że nie da się tego zrobić w ramach jednej gałęzi bez zbytniego skupiania kodu.
Wolałbym móc trzymać go w jednym oddziale i używać plików zlokalizowanych i konfiguracyjnych, szczególnie jeśli powiesz, że różnice są niewielkie.
Innym sposobem mogą być różne kompilacje, na przykład plik kompilacji zawiera różne pliki dla różnych klientów, ale widzę też narzędzie kompilacji sprawdzające różne gałęzie. Gdy używasz git, powiedziałbym, że nie ma prawdziwych gotch. Jedną strategią rozgałęziania może być opracowanie w różnych gałęziach dla różnych zadań, zameldowanie w głównej gałęzi i łączenie od głównej do edycji X i Y.


2

To brzmi bardziej jak zadanie dla różnych konfiguracji kompilacji. Odpowiedź Thitona idzie w tym kierunku, ale wziąłbym ją o wiele dalej niż #ifdef:

Użyj różnych celów kompilacji, aby zbudować różne wersje oprogramowania. Cele mogą się różnić

  • konfiguracja, którą obejmują,
  • zawarte w nich pliki obiektów lub źródeł lub
  • przetwarzanie wstępne kodu źródłowego.

To wstępne przetwarzanie może oczywiście obejmować klasyczny preprocesor C, ale może również wymagać użycia niestandardowego preprocesora, silnika szablonów do tworzenia niestandardowych widoków…

W ten sposób unikasz konieczności aktywnego wypychania każdej zmiany do wielu gałęzi, co narusza OSUSZANIE (oczywiście to też można zautomatyzować, ale nie widzę korzyści).


1

Używałbym gałęzi tylko do znaczących zmian, w przeciwnym razie kończysz dodawanie każdej drobnej zmiany do wielu gałęzi, co wcale nie jest fajne i jest bardzo podatne na błędy, szczególnie jeśli pracujesz z większą liczbą osób.


1

Jeśli wydajesz je wszystkie jako różne produkty, zalecane jest posiadanie wielu oddziałów. Jeśli nie, nadal zaleca się użycie czegoś takiego jak pień lub gałąź główna.

Myślę też, że będzie to zależeć od twojego procesu rozwoju, szczególnie wdrożenia. Jeśli masz proces, który pozwala na wdrożenie tylko jednej gałęzi do produkcji, a gałęzie są traktowane jako „kompilacje przyrostowe”, co oznacza, że ​​wersja B nie może zostać wdrożona do produkcji, chyba że wersja A została wdrożona jako pierwsza, biorąc pod uwagę, że wszystkie zmiany A są już w B, więc posiadanie wielu gałęzi jest dobrym rozwiązaniem. Działa to, jeśli masz zespoły rozrzucone po całym świecie i zwykle masz zmiany uporządkowane według priorytetów.


-2

Rozwiązanie z trzema różnymi gałęziami (w zakresie produkcji, rozwoju i funkcji) działa naprawdę dobrze. Załóżmy, że odkryłeś jakiś błąd w kodzie produkcyjnym, a następnie możesz zastosować łatkę, a następnie go zwolnić. Tylko upewnij się, że nie wprowadzasz żadnych dodatków do gałęzi produkcyjnej ani żadnych poważniejszych zmian w gałęzi produkcyjnej. Ty i Twój zespół będziecie musieli się zdyscyplinować, aby nie wprowadzać żadnych poważniejszych zmian w swojej branży produkcyjnej. Oddział produkcyjny powinien zajmować się jedynie drobnymi poprawkami, które nie gwarantują poważnych zmian w bazie kodu produkcyjnego.


1
OP pyta o różne gałęzie dla wariantów pojedynczego produktu, a nie o opracowanie oddzielnych funkcji itp.
CV
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.