Jeśli zastosujesz się do moich zaleceń poniżej (mam od lat), będziesz mógł:
- umieść każdy projekt w dowolnym miejscu w kontroli źródła, o ile zachowasz strukturę z katalogu głównego projektu
- buduj każdy projekt w dowolnym miejscu na dowolnej maszynie, przy minimalnym ryzyku i minimalnym przygotowaniu
- buduj każdy projekt całkowicie samodzielnie, o ile masz dostęp do jego binarnych zależności (lokalna "biblioteka" i "wyjściowe" katalogi)
- budować i pracować z dowolną kombinacją projektów, ponieważ są one niezależne
- budować i pracować z wieloma kopiami / wersjami jednego projektu, ponieważ są one niezależne
- unikaj zaśmiecania repozytorium kontroli źródła wygenerowanymi plikami lub bibliotekami
Polecam (tu wołowina):
Zdefiniuj każdy projekt w celu utworzenia jednego podstawowego elementu dostarczanego, takiego jak .DLL, .EXE lub .JAR (domyślnie w programie Visual Studio).
Strukturyzuj każdy projekt jako drzewo katalogów z jednym korzeniem.
Utwórz zautomatyzowany skrypt kompilacji dla każdego projektu w jego katalogu głównym, który zbuduje go od podstaw, bez żadnych zależności od IDE (ale nie uniemożliwiaj budowania go w IDE, jeśli to możliwe).
Rozważ nAnt dla projektów .NET w systemie Windows lub czegoś podobnego w zależności od systemu operacyjnego, platformy docelowej itp.
Spraw, aby każdy skrypt budowania projektu odwoływał się do zewnętrznych (zewnętrznych) zależności z jednego lokalnego katalogu „biblioteki”, z każdym takim plikiem binarnym W PEŁNI identyfikowanym przez wersję: %DirLibraryRoot%\ComponentA-1.2.3.4.dll
, %DirLibraryRoot%\ComponentB-5.6.7.8.dll
.
Spraw, aby każdy skrypt kompilacji projektu publikował podstawowy element dostarczany w pojedynczym lokalnym udostępnionym katalogu „wyjściowym”: %DirOutputRoot%\ProjectA-9.10.11.12.dll
, %DirOutputRoot%\ProjectB-13.14.15.16.exe
.
Spraw, aby każdy skrypt budowania projektu odwoływał się do jego zależności za pośrednictwem konfigurowalnych iw pełni wersjonowanych ścieżek bezwzględnych (patrz wyżej) w katalogach „biblioteka” i „wyjście”, ORAZ ŻADNYCH INNYCH.
NIGDY nie pozwól, aby projekt bezpośrednio odwoływał się do innego projektu lub jakiejkolwiek jego zawartości - zezwalaj tylko na odniesienia do podstawowych elementów dostarczanych w katalogu „output” (patrz powyżej).
Spraw, aby każdy skrypt kompilacji projektu odwoływał się do wymaganych narzędzi kompilacji za pomocą konfigurowalnej iw pełni wersjonowanej ścieżki bezwzględnej: %DirToolRoot%\ToolA\1.2.3.4
, %DirToolRoot%\ToolB\5.6.7.8
.
Dokładamy wszelkich build skryptu zawartość źródła odniesienia bezwzględną ścieżkę w stosunku do głównego katalogu projektu: ${project.base.dir}/src
, ${project.base.dir}/tst
(składnia zależy od budowy narzędzia).
ZAWSZE wymagaj, aby skrypt budowania projektu odnosił się do KAŻDEGO pliku lub katalogu za pośrednictwem bezwzględnej, konfigurowalnej ścieżki (zakorzenionej w katalogu określonym przez konfigurowalną zmienną): ${project.base.dir}/some/dirs
lub ${env.Variable}/other/dir
.
NIGDY nie zezwalaj skryptowi budowania projektu na odwoływanie się do CZEGOKOLWIEK za pomocą ścieżki względnej, takiej jak .\some\dirs\here
lub ..\some\more\dirs
, ZAWSZE używaj ścieżek bezwzględnych.
NIGDY nie zezwalaj skryptowi budowania projektu na odwoływanie się do CZEGOKOLWIEK przy użyciu ścieżki bezwzględnej, która nie ma konfigurowalnego katalogu głównego, takiego jak C:\some\dirs\here
lub \\server\share\more\stuff\there
.
Dla każdego konfigurowalnego katalogu głównego, do którego odwołuje się skrypt kompilacji projektu, zdefiniuj zmienną środowiskową, która będzie używana dla tych odwołań.
Spróbuj zminimalizować liczbę zmiennych środowiskowych, które musisz utworzyć, aby skonfigurować każdy komputer.
Na każdym komputerze utwórz skrypt powłoki, który definiuje niezbędne zmienne środowiskowe, specyficzne dla TEGO komputera (i ewentualnie specyficzne dla tego użytkownika, jeśli ma to zastosowanie).
NIE umieszczaj skryptu powłoki konfiguracyjnej specyficznej dla komputera w kontroli źródła; zamiast tego dla każdego projektu zatwierdź kopię skryptu w katalogu głównym projektu jako szablon.
WYMAGAJĄ każdego skryptu budowania projektu, aby sprawdził każdą z jego zmiennych środowiskowych i przerywał, wysyłając znaczący komunikat, jeśli nie są zdefiniowane.
WYMAGAJĄ każdego skryptu budowania projektu, aby sprawdził każdy z jego zależnych plików wykonywalnych narzędzia do budowania, plików bibliotek zewnętrznych i zależnych plików dostarczalnych projektów i przerwał, wyświetlając znaczący komunikat, jeśli te pliki nie istnieją.
OPIERAJ SIĘ przed pokusą przekazania JAKICHKOLWIEK wygenerowanych plików do kontroli źródła - żadnych elementów projektu, żadnego wygenerowanego źródła, żadnych wygenerowanych dokumentów itp.
Jeśli używasz środowiska IDE, wygeneruj dowolne pliki kontrolne projektu, które możesz, i nie zatwierdzaj ich do kontroli źródła (dotyczy to plików projektu programu Visual Studio).
Stwórz serwer z oficjalną kopią wszystkich zewnętrznych bibliotek i narzędzi, które mają być kopiowane / instalowane na stacjach roboczych programistów i maszynach budowlanych. Utwórz kopię zapasową wraz z repozytorium kontroli źródła.
Stwórz serwer ciągłej integracji (maszynę budującą) BEZ żadnych narzędzi programistycznych.
Rozważ narzędzie do zarządzania zewnętrznymi bibliotekami i materiałami dostarczanymi, takie jak Ivy (używane z Ant).
NIE używaj Mavena - początkowo cię uszczęśliwi, a ostatecznie doprowadzi do płaczu.
Zauważ, że nic z tego nie jest specyficzne dla Subversion, a większość z nich jest ogólna dla projektów nakierowanych na dowolny system operacyjny, sprzęt, platformę, język itp. Użyłem trochę składni specyficznej dla systemu operacyjnego i narzędzia, ale tylko dla ilustracji - - Ufam, że przełożysz na swój system operacyjny lub wybrane narzędzie.
Dodatkowa uwaga dotycząca rozwiązań Visual Studio: nie umieszczaj ich w kontroli źródła! Dzięki takiemu podejściu w ogóle ich nie potrzebujesz lub możesz je wygenerować (podobnie jak pliki projektu programu Visual Studio). Uważam jednak, że najlepiej jest pozostawić pliki rozwiązania poszczególnym programistom do tworzenia / używania według własnego uznania (ale nie w kontroli źródła). Rob.sln
Na mojej stacji roboczej przechowuję plik, z którego odwołuję się do mojego bieżącego projektu (ów). Ponieważ wszystkie moje projekty są samodzielne, mogę dowolnie dodawać / usuwać projekty (oznacza to brak odniesień do zależności opartych na projektach).
Proszę nie używać zewnętrznych elementów Subversion (lub podobnych w innych narzędziach), są one anty-wzorcem i dlatego są niepotrzebne.
Jeśli wdrażasz ciągłą integrację, a nawet chcesz zautomatyzować proces wydawania, utwórz dla niej skrypt. Stwórz pojedynczy skrypt powłoki, który: pobiera parametry nazwy projektu (zgodnie z listą w repozytorium) i nazwę znacznika, tworzy katalog tymczasowy w konfigurowalnym katalogu głównym, sprawdza źródło dla podanej nazwy projektu i nazwy znacznika (poprzez utworzenie odpowiedni adres URL w przypadku Subversion) do tego katalogu tymczasowego, wykonuje czystą kompilację, która uruchamia testy i pakuje element dostarczany. Ten skrypt powłoki powinien działać w każdym projekcie i powinien zostać wpisany do kontroli źródła jako część projektu „narzędzi do budowania”. Twój serwer ciągłej integracji może używać tego skryptu jako podstawy do tworzenia projektów, a nawet może go udostępniać (ale nadal możesz chcieć własnego).
@VonC: NIE chcesz pracować przez cały czas z "ant.jar" zamiast "ant-abcdjar" po wypaleniu skryptu kompilacji, ponieważ nieświadomie uruchomiłeś go z niekompatybilną wersją Ant. Jest to szczególnie częste między Ant 1.6.5 i 1.7.0. Ogólnie rzecz biorąc, ZAWSZE chcesz wiedzieć, jaka konkretna wersja KAŻDEGO komponentu jest używana, w tym Twoja platforma (Java ABCD) i narzędzie do budowania (Ant EFGH). W przeciwnym razie w końcu napotkasz błąd, a Twoim pierwszym DUŻYM problemem będzie śledzenie, jakie wersje różnych komponentów są zaangażowane. Po prostu lepiej jest rozwiązać ten problem z góry.