Kontrola wersji powinna zawierać kod i konfigurację potrzebną do zbudowania aplikacji.
To znaczy że:
Tymczasowe rzeczy, które zostały wprowadzone na krótki czas (na przykład czas potrzebny do ustalenia lokalizacji błędu lub na przykład eksperymentowania z funkcją języka) nie powinny mieć kontroli wersji: zachowaj ją, dopóki nie będziesz potrzebować to, a następnie po prostu usuń go podczas wykonywania zatwierdzenia .
Pliki lokalne właściwe dla danego komputera mogą być przechowywane w oddziale.
Unikałbym trzymania ich tylko lokalnie, ponieważ zbyt bolesne jest ponawianie wszystkich tych rzeczy, gdy laptop zostanie skradziony lub wirus zmusi cię do ponownej instalacji systemu operacyjnego (a swoją drogą, okazuje się, że twoja ostatnia kopia zapasowa została wykonana dwa lata temu) .
Z drugiej strony, uważaj na strukturę plików: lokalna konfiguracja jest OK, aż stanie się przytłaczająca i zmusi cię do wprowadzenia jednej zmiany w każdym pliku każdego z 42 programistów uczestniczących w projekcie.
Uważaj na możliwość usunięcia szczegółów między maszynami. Może to oznaczać:
Zapewniając dostęp do deweloperskiego serwera SQL w celu zastąpienia lokalnych instancji na komputerach programistów,
Korzystanie z usług dystrybucji pakietów, takich jak Pypi lub npm, w przypadku pakietów publicznych i ich prywatnych odpowiedników w przypadku pakietów wewnętrznych,
Poproś członków zespołu o zainstalowanie tych samych wersji oprogramowania,
Spraw, aby aktualizacje oprogramowania były jak najbardziej przejrzyste,
Lub umożliwić wdrożenie systemu operacyjnego i potrzebnego oprogramowania na komputerze za pomocą jednego kliknięcia (plus czas dla każdego programisty na zainstalowanie preferowanego Vima vs. Emacsa, Chrome vs. Firefox itp.)
Więc:
Pliki projektu Ścieżki mogą wymagać edycji w celu odzwierciedlenia układu na bieżącym komputerze.
Dlaczego nie użyć tego samego układu na każdym komputerze? Ścieżki w projekcie powinny być względne do pliku projektu, co oznacza, że nie ma znaczenia, gdzie znajduje się projekt. Wersje oprogramowania i bibliotek lepiej są takie same, aby uniknąć tajemniczych błędów, które pojawiają się tylko na niektórych komputerach i nie są możliwe do odtworzenia dla innych członków zespołu.
Przykład:
W projekcie utworzonym za pomocą Visual Studio możesz znaleźć:
Same pliki. Ścieżki są względne, nie ma znaczenia, czy na moim komputerze projekt jest zlokalizowany, H:\Development\Hello World Project\
podczas gdy inni członkowie zespołu sprawdzali projekt C:\Work\HelloWorld\
.
Zależności, tj. Biblioteki stron trzecich i biblioteki wewnętrzne. Oba typy powinny być obsługiwane przez NuGet, co powoduje, że wszystkie dyskusje dotyczące konfliktów stają się nieaktualne. Jeśli nie masz tej samej wersji biblioteki, którą mam, poproś NuGet o zaktualizowanie zależności. To takie proste (gdy działa dobrze, co nie zawsze tak jest).
Należy pamiętać, że kluczowe znaczenie ma także zachowanie bibliotek wewnętrznych w prywatnym NuGet. Posiadanie kilku bibliotek przechowywanych w folderze współdzielonym lub wysyłanych pocztą e-mail przez zespół prowadzi do anarchii i depresyjnych serwerów CI.
Ustawienia. Ważne jest, aby zespół dzielił te same ustawienia. Jeśli połowa zespołu zdecyduje się traktować ostrzeżenia jako błędy, a połowa zespołu zachowa ostrzeżenia w niezmienionej postaci, członkowie pierwszej części zespołu poświęcą czas na usuwanie ostrzeżeń generowanych przez programistów z drugiej części zespołu.
Ustawienia związane z narzędziami. Są to trudne, ponieważ niektórzy członkowie zespołu mogli zainstalować niektóre narzędzia, a inni nie.
Zdecydowanie zaleca się zainstalowanie tego samego zestawu narzędzi. Jeśli niektórzy programiści chcą używać StyleCop, a inni nie, zespół nie wykona zadania. Jeśli niektórzy korzystają z umów Kodeksu, a inni nie, będą mieć te same problemy.
Makefile. Na przykład optymalizacja może wymagać wyłączenia podczas debugowania, ale nie w przypadku serwera CI.
Zachowaj kilka plików makefile w kontroli wersji. Nie jest niczym niezwykłym budowanie wersji debugowania również na serwerze CI i przekazywanie jej do klienta, który napotyka trudny błąd.
Brudne brzydkie hacki. Na przykład zwróć 7 w środku funkcji, aby przetestować coś, w zależności od funkcji, i podejrzewasz, że pęknie przy wartości 7.
Unikałbym takiego kodu w pierwszej kolejności. Aby coś przetestować, użyj testów jednostkowych. Jeśli naprawdę zajmuje kilka sekund zamiana kodu w celu debugowania , zrób to, ale i tak usuniesz ten kod za kilka minut, więc nie musisz go zatwierdzać.
Jak to opisujesz, powinieneś napisać test. Na przykład, jeśli chcesz mieć pewność, że:
class TemperatureConverter
{
public int CelsiusToFahrenheit(int temperature)
{
...
}
}
zgłasza wyjątek, gdy temperature
jest gorszy od AbsoluteZero
stałego, nie powinieneś grać samym kodem. Zamiast tego utwórz test jednostkowy, który:
- samodzielnie udokumentuj swój kod,
- zwiększ niezawodność swojego kodu,
- upewnij się, że opiekunowie mogą polegać na testach regresyjnych podczas modyfikowania powyższej metody,
- służyć innym programistom z zespołu, którzy mogą potrzebować wykonać ten sam test.