Konfiguracja dużego systemu oprogramowania w Delphi

Mamy pakiet oprogramowania, który ma około 16 lat. Przeszło przez prawie każdą wersję Delphi (poza. NET). Z biegiem lat rzeczy stały się bardzo mylące, jeśli chodzi o porównywanie i utrzymywanie właściwej konfiguracji dla dodatkowych pakietów (takich jak biblioteki innych firm). Zastanawiałem się, czy istnieje jakaś standardowa praktyka, jeśli chodzi o organizowanie dużych projektów (i grup projektów) takich jak ten.

Tak aby wyjaśnić obecny / align = "left" / ..

Jest to system wielozadaniowy. Oznacza to, że zaangażowanych jest 12 projektów wykonywalnych (i kilka projektów DLL i usług). Przechowujemy również rzeczy w SourceSafe i wielu programistów pracuje nad tym samym kodem na różnych komputerach. Wszystkie te projekty są bardziej-więc wrzucane do centralnego folderu. Folder "Root" zawiera główny projekt EXE (wraz z około 20 folderami, wszystkie zawierające jednostki i formularze) i wydaje się prawie nieskończoną hierarchią folderów i pliki. Tylko ten jeden projekt zawiera pół miliona linii kodu.

Wtedy wszystkie dodatkowe aplikacje nie muszą być odpowiednio oddzielone od tego dużego projektu. Każdy z tych projektów ma swój własny folder oparty na głównym projekcie.

Moje dwa główne problemy to:

  • Jak prawidłowo skonfigurować pliki DCU, aby nie były mieszane z projektami? DCU nie powinny być umieszczane w SourceSafe (i innych podobnych plikach) lub w przeciwnym razie każdy plik skompilowany z projektu. Visual SourceSafe sprawia, że pliki tylko do odczytu, gdy nie są sprawdzane, a pliki DCU (i pliki EXE i inne) nie mogą być zapisywane w tym przypadku. Jak więc właściwie oddzielić dowolny z takich plików do zdalnej lokalizacji, aby uniknąć mieszania się z kodem źródłowym?
  • Jak poprawnie skonfigurować pakiety i biblioteki? Mamy następujące:
    • QuickReports 5.05
    • NativeJpg library V302 -
    • kolejny anonimowy raport biblioteka
    • nasz własny pakiet komponentów, który wymaga QuickReports, NativeJpg i innej anonimowej biblioteki

Wszystkie 4 z tych bibliotek są przechowywane w zupełnie innych miejscach każdego komputera i wymagają pewnej centralizacji. Największym problemem związanym z konfiguracją każdego nowego komputera programisty jest zlokalizowanie go z głównego komputera programisty i skopiowanie go do tego samego miejsca na innym komputerze (i upewnienie się, że ścieżka biblioteki jest poprawna, itd.).

Musimy również zachować zupełnie oddzielne środowiska dla różnych wersji Delphi na tym samym komputerze. Oznacza to kopię projektów na każdym komputerze, kopię pakietów i bibliotek na każdym komputerze, kopię projektów, pakietów i bibliotek w SourceSafe itp. Każdy komputer musi mieć identyczną konfigurację. Już teraz wykorzystujemy zmienne środowiskowe, aby skierować nasze projekty, gdzie szukać określonych plików projektu (i bibliotek).

Kolejna nowa problem: XE2 wprowadza 64-bitowe możliwości. Nie planujemy kompilacji 64bit jeszcze, ale na pewno w przyszłości. Jak prawidłowo odróżnić 32bit od 64bit we wszystkich tych projektach?

To, o co naprawdę proszę, to odniesienie do dobrego tutoriala, jak zoptymalizować takie środowisko i utrzymać je w jak najlepszym porządku. Nie oczekuję, że ktoś odpowie na to pytanie. Projekty mają ponad 15 lat, w rękach 200 + deweloperów z na całym świecie i ma wiele odniesień między projektami. Na przykład, jeden projekt może używać jednostki z innego projektu i vice-versa. Osobiście nie podoba mi się ta koncepcja, ale też nie zaprojektowałem jej od początku. Otrzymałem zadanie uporządkowania tego systemu i dokładnego udokumentowania, jak skonfigurować Delphi na nowym komputerze dla nowych programistów do pracy nad naszymi projektami. Jak patrzę na nasze projekty (bo niekoniecznie jestem programistą systemu, ale jestem wciągnięty do rozwoju), widzę wiele zamieszania w tym, jak kod jest zorganizowany.

Zakładam, że prawdopodobnie Embarcadero ma jakieś wytyczne i standardy dotyczące tworzenia takiego środowiska?

Author: Jerry Dodge, 2012-01-22

7 answers

Lokalizacja plików DCU

Jeśli chodzi o DCU, które są wynikiem procesu kompilacji, należy określić katalog wyjściowy DCU w każdym pliku projektu. Domyślna wartość dla tego, w najnowszej wersji Delphi będzie w porządku: .\$(Platform)\$(Config). Powoduje to powstanie podfolderów katalogu projektu, takich jak: Win32\DEBUG lub Win64\RELEASE.

Jeśli skonfigurujesz pliki projektu za pomocą zestawów opcji, będziesz mógł kontrolować to ustawienie (i wszystkie inne) z niewielkiej liczby opcji pliki.

Lokalizacja kodu strony trzeciej

Należy zawsze używać biblioteki trzeciej strony jako kodu. Jeśli sprzedawca pobiera więcej opłat za otrzymanie biblioteki jako kodu, Zapłać. Gdy już to zrobisz, po prostu dołącz kod źródłowy do systemu kontroli wersji (VCS) i traktuj go w dużej mierze tak samo, jak traktujesz swój własny kod. Mówię to głównie dlatego, że należy unikać modyfikowania go.

Gdy masz cały kod w VCS, możesz umieścić cały kod źródłowy na nowym maszyna z pojedynczą operacją kasową.

Organizacja twoich projektów

Osobiście mam silną niechęć do używania ścieżek wyszukiwania kompilatora. Nie używam ich i włączam każdą jednostkę, która jest wymagana w projekcie w .akta dpr.

Jeśli używasz ścieżek wyszukiwania, uniemożliwiasz pracę nad wariantem projects.So Załóżmy na przykład, że masz klienta, który odkrył błąd w wersji oprogramowania, które wydałeś 2 lata temu. Chciałbyś Rozwiąż ten błąd, wydając aktualizację do 2-letniej wersji oprogramowania. Jest całkowicie prawdopodobne, że poproszenie ich o aktualizację do najnowszej wersji nie jest opłacalne. Być może nie zapłacili za modernizację. Być może pełna aktualizacja ma przełomowe zmiany, z którymi nie chcą się teraz uporać. Doskonałym przykładem mogą być wszyscy programiści Delphi, którzy nadal używają Delphi 7.

Teraz, po zmotywowaniu scenariusza, jak stworzyłbyś środowisko budowania dla 2-latka projekt? Jeśli używasz ścieżek wyszukiwania, będą one odnosić się do dzisiejszych bibliotek. Będziesz zmuszony zmienić ścieżkę wyszukiwania lub skopiować stare biblioteki na wierzch dzisiejszych bibliotek.

Ten cały ból głowy jest trywialnie stopniowany przez nieużywanie ścieżek wyszukiwania i włączenie wszystkich źródeł do VCS.

Powinieneś dążyć do tego, aby móc zrealizować dowolną historyczną wersję programu i natychmiast go zbudować. Powinieneś być w stanie to zrobić z pełnym pewność, że budujesz identyczne oprogramowanie do tego, co zostało zbudowane w momencie wydania tej wersji. Wymaga to również automatyzacji budowania, ale nie mogę sobie wyobrazić, że brakuje ci tego w przypadku projektu o tej wielkości.

 11
Author: David Heffernan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 09:44:16

Zajmę się organizacją folderów. To pochodzi z pakietu oprogramowania, który ma 50 + exe i dll i mnóstwo bibliotek stron trzecich, więc myślę, że wiem, skąd pochodzisz...

Używamy Perforce jako systemu kontroli źródła, więc główny folder mojej domyślnej przestrzeni roboczej nazywa się Perforce, ale mam również kilka innych obszarów roboczych skonfigurowanych i są one w Perforce2, Perforce3, itp.

Ogólna konfiguracja folderu (zaczynając od folderu głównego obszaru roboczego)

General
  Components
    Delphi
      Indy
        Indy9
        Indy10
      MadCollection
        v2.5.8.0
        v2.6.0.0
  Plugins
Releases
  Released
  ... a folder for each release we publish ... (and equal to a branch in Perforce)
Work
  Acceptance
  Sub1
  Sub2

Mój Ścieżka biblioteki środowiskowej w IDE jest pusta(nie ma tam nawet ścieżek standardowych BDE). Zapewnia to, że ścieżki projektu deklarują wszystkie potrzebne ścieżki i że projekty nie są zależne od konfiguracji IDE konkretnej maszyny.

Mamy ustawione w IDE środowisko var (ie MRJ), które wskazuje na "General\Components\Delphi", więc w opcjach projektu deklarujemy ścieżki do naszych komponentów jako $(MRJ)\MadCollection\2.6.0.0.

General posiada wtyczki IDE i komponenty używane przez nasze projekty. We keep all wersje, których używamy w kontroli źródeł. W ten sposób, kiedy muszę wrócić do starego wydania, aby wyśledzić problem, mogę po prostu wyciągnąć go i zbudować go, ponieważ jego ścieżki biblioteczne nadal będą wskazywać na wersję komponentów, których to konkretne wydanie potrzebuje.

Organizacja folderów w danej gałęzi pracy (akceptacja lub jedna z jej podgrup) przebiega według tego wzoru:

General          
  Includes
  MainComponent1
    Project1
    Project2
    Shared
  MainComponent2  
    Project3
    Project4
    Shared
  Shared
Windows          
  SoftwareSuite  
    Scripts
      Tools
  MainComponent1
    Project1
      Dcus
    Project2
      Dcus
  MainComponent2  
  Tools
    Tool1
      Dcus
    Tool2
      Dcus

Folder ogólny zawiera wszystkie niezależne od platformy źródła / pliki, folder Windows zawiera wszystkie Pliki specyficzne dla systemu Windows. Każdy komponent może zawierać wiele projektów i będzie miał folder udostępniony dla źródeł udostępnionych między tymi projektami. Folder udostępniony bezpośrednio w sekcji Ogólne zawiera źródła udostępniane przez wszystkie projekty. Folder Windows jest skonfigurowany w podobny sposób.

Zauważ, że każdy projekt ma swój własny folder DCU . Jest to skonfigurowane w opcjach projektu. Ponieważ ścieżka może być wprowadzona jako .dcus, my (przynajmniej ja) ustawiamy ją jako domyślną dla każdego nowego projektu. Każdy projekt wysyłający swoje DCU do unikalnego folderu zapewnia dwie rzeczy:

  • łatwo jest utrzymać dcu poza kontrolą wersji, po prostu ustawiając filtr w oprogramowaniu do kontroli wersji.
  • co ważniejsze zapewnia, że kompilacja/budowa projektu nigdy nie ingeruje w kompilację/budowę innego projektu. Mogę bezpiecznie zmienić ustawienia i budować wiedząc, że nie będzie mi przeszkadzało leżenie dcu z poprzedniej kompilacji z innego projekt.
 9
Author: Marjan Venema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 10:24:39

Polecam następujące praktyki:

  1. Zachowaj prostą ścieżkę biblioteki i upewnij się, że wszystko w ścieżce biblioteki jest albo folderem dostarczanym z delphi, albo folderem binarnym (biblioteki) DCU w Twoim d:\Components \ folder.

  2. Użyj nowoczesnego typu kontroli wersji. Polecam Mercurial nad innymi. Źródło Bezpieczne to gówno, przestań go używać.

  3. Utwórz kopię zapasową swojego środowiska (klucze rejestru eksportu itp.) i przywróć je do innych komputerów deweloperskich w ustandaryzowany sposób. Możesz zatrzymać kilka .reg i .pliki cmd (wsadowe) w celu automatyzacji konfiguracji nowego systemu. możesz umieścić te skrypty w repozytorium komponentów w systemie kontroli wersji.

 5
Author: Warren P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-21 23:31:30

Poza zakresem, który był w dużej mierze omawiany wcześniej, polecam :

  • testy jednostkowe - z Dunitem na przykład
  • ciągła integracja. Żeby mieć pewność, że wszystkie te projekty mogą się skompilować na innej maszynie i że testy są w porządku.

Jest to więc mocno związane z organizacją projektu i strategią VCS.

 3
Author: TridenT,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 10:45:41

Dla podobnej konfiguracji, firma, dla której pracowałem, uznała tę konfigurację za przydatną:

  • wszystkie biblioteki stron trzecich (komponenty itp.) go to a fixed location (C:\Delphi\name-version)
  • projekty Delphi mogą być sprawdzane z poziomu kontroli wersji w dowolnym miejscu (napęd C: lub D: i nazwa folderu nie ma znaczenia), ponieważ wszystkie projekty i skrypty używają ścieżek względnych
  • wszystkie projekty są podfolderami jednego głównego folderu projektu, więc sprawdzenie tego spowoduje, że projekty Delphi i innych odpowiednich zasobów do stacji roboczej, a aktualizacja kontroli wersji jest łatwa do zrobienia
  • używamy skryptu build (napisanego w Apache Ant), który znajduje się w głównym folderze i iteruje we wszystkich folderach, aby zbudować Aplikacje Delphi i uruchomić testy jednostkowe i integracyjne na deweloperskim serwerze bazy danych, aby sprawdzić, czy wszystkie zmiany działają przed sprawdzeniem kontroli źródła
  • skrypt build może być również uruchamiany automatycznie na build server (Hudson CI) na każdym commit to see if something broke

I notatka o bibliotekach komponentów: unikaj instalacji pakietu tam, gdzie to możliwe, preferuj tworzenie komponentów w czasie wykonywania. Jeśli szybko musisz zastosować poprawkę do pięcioletniej wersji projektu, odinstalowanie / zainstalowanie kilkunastu pakietów może stać się frustrujące. Przynajmniej w przypadku komponentów niewizualnych tworzenie w czasie wykonywania to ogromna oszczędność czasu.

Sprawdzanie kodu stron trzecich w kontroli źródeł może być bardzo pomocne, na przykład aby udostępnić poprawki, które nie są jeszcze dostępne jako nowe oficjalne wydania. Najlepsze praktyki omówiono w rozdziale dokumentacja programu Subversionoddziały sprzedawcy. Dodatkowo, dzięki Subversion możesz użyć svn:externals , aby umieścić określoną wersję (tag) bezpośrednio w strukturze katalogów projektu. Może być używany zarówno z bibliotekami innych firm, jak i z własnym kodem źródłowym, co ułatwia zarządzanie zależnościami i konfigurację stacji roboczej.

P. s. skrypt budowy mrówek definiuje ścieżki wyszukiwania dla wszystkiego, więc jest to 'odniesienie' dla wszystkich programistów, jak skonfigurować IDE, gdzie umieścić biblioteki stron trzecich i które flagi kompilatora użyć

P. P. S. Twój projekt brzmi nieźle - jestem otwarty na pracę na umowę zlecenie:)

 2
Author: mjn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-22 11:05:44

Mój zespół korzysta z wirtualizacji i kiedy widzimy wstecz, było to naprawdę dobre posunięcie. Używamy laptopów MacBook Pro i VMware Fusion, ale jestem pewien, że inne pakiety działają dobrze, jak VirtualBox lub VirtualPC.

Zawsze dobrze jest wiedzieć, że gdy nowy programista zaczyna lub stara instalacja ma problemy, wystarczy skopiować nowy obraz maszyny Wirtualnej z obrazu głównego, a konfiguracja jest dokładnie jako oryginał. Obraz główny jest przechowywany na szybkim dysku USB2. Teraz, gdy piorun i Zbliża się USB3 byłoby jeszcze szybciej skopiować obraz. I nie ma realnej troski o wydajność na nowoczesnym komputerze, o ile jest pamięć. 8 GB powinno wystarczyć, aby uruchomić 2 obrazy w parallell. Kolejną zaletą wirtualizacji jest to, że tak łatwo jest wypróbować scenariusz What if . Eksperymentuj z różnymi konfiguracjami i wersjami bez ryzyka zakłócenia rzeczywistego środowiska pracy.

Btw też uważam, że SourceSafe to gówno... :-)

 2
Author: Roland Bengtsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-23 17:52:16

Somé porady:

  • Utwórz jeden plik groupproject dla wszystkich aplikacji należących do projektu, każda aplikacja w swoim własnym katalogu pod plikiem groupproj

  • Powinieneś być w stanie określić, które typy plików należy włączyć do systemu kontroli wersji. Upewnij się, że w Delphi zapisywane są pliki DFM w formacie tekstowym.

  • Mozna powiedziec Delphi aby wypisywal DCU w subdirach o nazwie 'dcu' pod kazdym programem (mniej visaul clutter).

  • Rzeczy osób trzecich często nalega na instalację w różnych miejscach, niewiele można z tym zrobić. Tworzenie dokumentu opisującego konfigurację kompletnego środowiska pracy i aktualizowanie go

  • Rozwijaj w maszynach wirtualnych. Nowy programista otrzymuje kopię maszyny wirtualnej.

  • Utrzymanie dla różnych wersji Delphi? Przemyśl to, spróbuj przejść do jednej wersji. Jeśli absolutnie musisz mieć dwa groupprojects i struktury katalogów dla każdej wersji. [Zakładam, że nie kompilujesz ta sama aplikacja z dwiema wersjami Delphi, czyli developer hell]

  • Delphi XE2 będzie wyprowadzać do różnych podkatalogów 32/64, co nie powinno sprawiać żadnych problemów.

 1
Author: Jan Doggen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-23 07:37:21