Автоматизація збирання і контролю версій проекту

Автоматизація збирання і контролю версій проекту

Для чого це потрібно.

При розробці проекту групою програмістів, типовою завданням є складання чергової версії проекту, далі тестування цієї версії, потім знову складання і т.п. Що б зібрати чергову версію, відповідального за складання доведеться взяти останні версії файлів, збільшити номер версії, зібрати проект і якщо все пройде успішно викласти для тестування в певне місце готовий файл або файли. Як правило, доводиться вести історію версій. При цьому потрібно мати Delphi з встановленими бібліотеками - відповідно перехід на нову версію Delphi або будь-якої з бібліотек може викликати безліч проблем: збірка на новій версії може виявитися непрацездатною і доведеться відкочуватися на стару версію Delphi і т.п.

Вообщем, це розповідь про те, як можна автоматизувати процес складання і відправки версій.

Де і як збирати проект.

Хочу відразу обмовитися, все описані надалі рецепти працюють на Delphi 6 (Update1, Update2).

Якщо ми говоримо про автоматичному складанні, то природно будемо користуватися командним рядком. У стандартному постачанні Delphi є дві програми за допомогою яких можна збирати проекти: dcc32 і make. Обидві вони знаходяться по шляху $ Delphi \ Bin.

DCC32 збирає один файл проекту переданий в якості командного рядка. Інші параметри (шляху до бібліотек, параметри компіляції і т.п.) можна також вказати в командному рядку або у файлі dcc32.cfg в $ Delphi \ Bin.

Make збирає всі проекти які вказані в make-файлі (насправді він послідовно викликає dcc32 для них). Більш того, в цьому звичайному текстовому файлі можна зручно правити шляху до бібліотек, а також параметри для компіляції.

Отже, створюємо директорію де будуть знаходиться файли. наприклад

Розшифровую: Delphi 6 + Update 2 + RTL update 1.

Копіюємо туди з відповідною директорії Delphi в такі ж директорії наступні файли:
BIN \ brc32.exe
BIN \ brcc32.exe
BIN \ dcc32.cfg
BIN \ DCC32.EXE
BIN \ lnkdfm60.dll
BIN \ make.exe
BIN \ rlink32.dll
BIN \ rw32core.dll
SOURCE \ *. *

Разом, близько 30М, і, в принципі, цього достатньо, але для простоти і швидкості скопіюйте також директорії «IMPORTS» і «LIB». Виходить близько 110М, але кого зараз хвилюють такі розміри? Залишилося поправити файл dcc32.cfg:
-aWinTypes = Windows; WinProcs = Windows; DbiProcs = BDE; DbiTypes = BDE; DbiErrs = BDE
-uC: \ Delphi \ D6U2RTL1 \ Lib; C: \ Delphi \ D6U2Rtl1 \ Bin
-iC: \ Delphi \ D6U2RTL1 \ Lib

Все це можна записати на болванку і завжди підняти систему для збирання проектів на Delphi за 5 хвилин на будь-якому комп'ютері.

Створимо в Delphi проект для того щоб відкомпілювати за допомогою нашого компілятора: Delphi-New appliсation. Потім збережемо його C: \ Delphi \ TestVer \ testVer.dpr. Туди ж збережемо наш файл групи проектів (наприклад з Project Manager - «Save Prgect Group as»). Тепер правимо рядок в файлі testver.bpg

Компілюємо наш проект:

Отже, якщо ви зробили все правильно, то повинні були отримати Testver.exe

Правила хорошого тона

Не люблю я, коли всі файли в купі, а тому трохи модернізуємо структуру каталогів -создадім окремі папки для вихідного, скомпільованих модулів і бінарників. Соответсвенно SOURCE, DCU, BIN. C: \ Delphi \ TESTVER \ BIN
C: \ Delphi \ TESTVER \ DCU
C: \ Delphi \ TESTVER \ SOURCE \
C: \ Delphi \ TESTVER \ SOURCE \ TestVer.bpg
C: \ Delphi \ TESTVER \ SOURCE \ TestVer.dpr
C: \ Delphi \ TESTVER \ SOURCE \ TestVer.res
C: \ Delphi \ TESTVER \ SOURCE \ Unit1.dfm
C: \ Delphi \ TESTVER \ SOURCE \ Unit1.pas

= EXE output directory
# -I

= Include directories
# -N

= DCU output directory
# -W = Output warning messages
# -Q = Quiet compile
# -CG = GUI target
DCC = $ (ROOT) \ bin \ dcc32.exe $ ** -B -e $ (BIN) -n $ (DCU) -u $ (LIB) -w -q -CG

TestVer.exe: $ (ProjectPath) \ Source \ TestVer.dpr
cd $ (ProjectPath) \ Source
$ (DCC)

Тепер можна і зібрати:

Підключаємо додаткові бібліотеки.

Для початку давайте включимо інформацію про версії файлу в проект і будемо її виводити. У Delphi робимо наступне Project-Options Коли ви включає цю опцію, Delphi автоматично створює скомпільований файл ресурсів з розширенням «res». Якщо подивитися на файл проекту (TestVer.dpr), то можна помітити директиву компілятора, яка повідомляє компілятору, що потрібно підключити файл з ім'ям проекту і розширенням «res».

Для виведення цієї інформації я скористаюся бібліотекою Jedi Code Library. хоча це не принципово (довгий час я користувався RXLib, але часи змінюються ...). Вихідні тексти бібліотеки я просто скопіюють в C: \ Delphi \ D6U2RTL \ Lib_AddOn \ JCL. Тепер правимо трохи вихідні (Source1.rar) напишемо обробник події на FormCreate: // Пропущено
uses
JclFileUtils;

Уважний читач уже помітив, що в make файлі вже використовується змінна LIB. Трохи модифікуємо файл TestVer.bpg на предмет вказівки шляхів для бібліотек LIBADDON = C: \ Delphi \ D6U2RTL1 \ Lib_AddOn
LIB = C: \ Delphi \ D6U2RTL1 \ Lib; $ (LIBADDON) \ JCL

Таким чином, модифікуючи змінну LIB, ми легко зможемо підключати нові бібліотеки.

Компіляція res файлу за допомогою brcc32

Все відмінно, з Delphi IDE ми вже можемо керувати інформацією в ресурсному файлі. Але як створити такий файл без Delphi IDE? Для це є утиліта brcc32. За допомогою цієї утиліти можна компілювати ресурсні файли. Я наведу приклад з якого сподіваюся, все буде ясно. Отже, створюємо файл TestVer.rc: MAINICON ICON ir.ico
1 VERSIONINFO
FILEVERSION 1,0,0,2
PRODUCTVERSION 1,0,0,2
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
FILEOS VOS__WINDOWS32
FILETYPE VFT_APP

BLOCK "VarFileInfo"
VALUE "Translation", 1049, 1 251
>

В результаті ви повинні отримати файл TestVer.res.

= EXE output directory
# -I

= Include directories
# -N

= DCU output directory
# -W = Output warning messages
# -Q = Quiet compile
# -CG = GUI target
DCC = $ (ROOT) \ bin \ dcc32.exe $ ** -B -e $ (BIN) -n $ (DCU) -u $ (LIB) -w -q -CG
BRCC = $ (ROOT) \ bin \ brcc32.exe

TestVer.exe: $ (PROJECTPATH) \ Source \ TestVer.dpr
cd $ (PROJECTPATH) \ Source
$ (BRCC) $ *
$ (DCC)

Автоматична зміна номера версії в rc файлі

Скористаємося для цього програмою, написаної якимось Chris Morris (Incverrc.rar). Поцупив я її з CodeCentral, і напевно, її ще можна там знайти. Користуватися цією програмою дуже просто - потрібно як параметр вказати ім'я rc файлу. Наприклад, так

Визначення версії файлу в командних файлах

Тепер ми можемо написати командний файл, який би автоматично збільшував номер версії і збирав проект. Але хотілося б, що б цей командний файл вмів визначати номер версії отриманого проекту і, наприклад, пакувати вихідні проекту в архів з цим номером. Простіше способу, ніж написати невелику програмку, я не знайшов. Отже, програма ExeVer - виводить в стандартний висновок форматований номер версії. Для складання потрібні JCL і rxLib. Приклади роботи програми нижче: C: \ Delphi \ ExeVer> ExeVer.exe C: \ Delphi \ TestVer \ Bin \ TestVer.exe% J.% I.% R.% B
1.0.0.2

C: \ Delphi \ ExeVer> ExeVer.exe C: \ Delphi \ TestVer \ Bin \ TestVer.exe% J-% I-% 2R-% 3B
1-0-00-002

C: \ Delphi \ ExeVer> ExeVer.exe C: \ Delphi \ TestVer \ Bin \ TestVer.exe% 3J
001

алгоритм складання

Будемо діяти за таким алгоритмом.

echo - vss. беремо останні версії файлів
rem ------------------------------------------------- ---------------
echo - vss. CheckOut% NAMEPROJECT% .rc
echo -. збільшуємо номер версії% NAMEPROJECT% .rc
C: \ Delphi \ Incverrc \ IncVerrc.exe -f% NAMEPROJECT% .rc
rem ------------------------------------------------- ---------------
echo - make: починаємо збирати проект

% MAKE% -f% NAMEPROJECT% .bpg>. \ Bin \ Out.txt

if errorlevel 1 goto endError

echo - make: Exe зроблений успішно
rem повертаємо інформацію про версії
echo - vss. CheckIn% NAMEPROJECT% .rc

echo rar a -r -ep1 -s -m5 -x * .scc. \ Archiv \% NAMEPROJECT% _ %% verBuild %%. rar. \ Source \ *. * >> t $$. bat
echo on
t $$. bat / wait
del t $$. bat
goto End

endError
rem ------------ сталася помилка під час компіляції ------------------

echo - vss. undoCheckOut% PROJECTNAME% .rc
echo.
echo ERROR см. out.txt
pause
cd. \ Bin

висновок

додатки