Автоматизація збирання і контролю версій проекту
Для чого це потрібно.
При розробці проекту групою програмістів, типовою завданням є складання чергової версії проекту, далі тестування цієї версії, потім знову складання і т.п. Що б зібрати чергову версію, відповідального за складання доведеться взяти останні версії файлів, збільшити номер версії, зібрати проект і якщо все пройде успішно викласти для тестування в певне місце готовий файл або файли. Як правило, доводиться вести історію версій. При цьому потрібно мати 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