Пример автоматизации сборки проекта

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Пример автоматизации сборки проекта

Сообщение alibek » 23.07.2007 (Пн) 9:08

Подумал, может кому полезным окажется.

Итак, у меня имеется некая программа. К программе прилагается справка (проект в Help & Manual 3), документация, установщик (использую Setup Factory 6), стартовый диск (использую Autorun Designer). Также будет красиво, если все файлы на диске будут иметь одинаковую дату, я для этого использовал утилиту FileTouch.

Для начала, все это хозяйство должно отвечать определенным требованиям.
1. В файл VB-проекта нужно своевременно обновлять версию и ревизию. Я обычно в настройках проекта включаю опцию Auto Increment Revision, чтобы не делать этого вручную.
2. В проекте есть модуль Declarations.bas, в котором задается константа Public Const vbAppDate As Date = #1/1/2007#. Разумеется константу необязательно называть именно так и она не обязательно должна быть единственной, можно добавить и Const vbAppMode As String = "demo".
3. Ресурсы к проекту я компилирую из RC-файлов. Это необязательно, можно использовать AddIn VB6 Resource Manager, но мне так удобнее.
4. В проекте справочного файла Help & Manual можно использовать переменные. У меня в этом проекте используются следующие переменные: COPYRIGHT (строка копирайта, выводимая в конце каждой страницы справки), VERSION (версия программы, которая выводится на титульной странице и в конце справки), APPDATE (дата программы, которая выводится на титульной странице). Там также есть несколько встроенных констант, например DATE удобно использовать в конце каждой статьи, чтобы в конечном файле пользователь видел дату последнего обновления статьи.
5. Для создания дистрибутивного пакета используется Setup Factory 6, который также позволяет задавать Design-Time Constants (содержимое которых будет подставлено при сборке дистрибутивного пакета). У меня используются следующие переменные: #OUTPUTDIR# (путь, куда будет сохранен созданный дистрибутивный пакет), #SETUPNAME# (имя файла дистрибутивного пакета), #VERSION# (номер версии программы, который выводится в диалоговых окнах), #REVISION# (ревизия программы, которая выводится по нажатию кнопки "Информация"), #BUILD# (билд программы, demo, beta, release и т.п.), #APPDATE# (дата программы, которая выводится по нажатию кнопки "Информация"), #APPYEAR# (год программы, подставляется в строке копирайта).
6. Структура каталогов имеет следующий вид:
Код: Выделить всё
<prj> - каталог проекта
<prj>\util - вспомогательные утилиты для сборки программы
<prj>\res - каталог, в котором размещаются файлы для ресурсов, картинки, иконки и т.п.
<prj>\help - каталог с исходниками для проекта справки (шаблоны, иллюстрации и т.п.)
<prj>\OUTPUT - каталог, с которого создается установочный CD
<prj>\OUTPUT\CLIENT - исполняемые файлы программы (может понадобиться при установке вручную)
<prj>\OUTPUT\CLIENT\SETUP - установочный пакет
<prj>\OUTPUT\CLIENT\RUNTIME - библиотеки, требуемые для работы программы; меется также файл install.bat, который их все копирует и регистрирует
<prj>\OUTPUT\DOC - документация к программе (техническая информация, PDF, руководство пользователя, офлайновая справка в виде exe-файла
<prj>\OUTPUT\SERVER - каталог, в котором размещаются серверные компоненты
<prj>\OUTPUT\SERVER\DBMS - дистрибутив СУБД (например MSDE)
<prj>\OUTPUT\SERVER\DATABASE - база данных в виде sql-файлов database.sql и data.sql; имеется также файл install.bat, который автоматически устанавливает базу данных
<prj>\OUTPUT\SERVER\TOOLS - различные инструменты для работы с базой данных


Для сборки используются следующие bat-файлы (пути и названия файлов даны для примера).


1. make_build.bat - полностью пересобрать все компоненты
Возможные аргументы:

make_build.bat [/jump <label>]
Перейти на этап <label>, пропустив предыдущие этапы. <label> может принимать значения: res (перекомпиляция ресурсов), exe (перекомпиляция проекта), help (перекомпиляция справки), setup (создание дистрибутива), finish (завершение).

Код: Выделить всё
@echo off
set base=%~dp0
set prj=Project1
set major=
set minor=
set rev=
set inc=
for /f "skip=2 tokens=2 delims==" %%s in ('find "MajorVer=" %prj%.vbp') do set major=00%%s
for /f "skip=2 tokens=2 delims==" %%s in ('find "MinorVer=" %prj%.vbp') do set minor=00%%s
for /f "skip=2 tokens=2 delims==" %%s in ('find "RevisionVer=" %prj%.vbp') do set rev=%%s
for /f "skip=2 tokens=2 delims==" %%s in ('find "AutoIncrementVer=" %prj%.vbp') do set inc=%%s
set major=%major:~-2%
set minor=%minor:~-2%
if *%inc% == *1 goto mode_inc
set rev=0000%rev%
set rev=%rev:~-4%
goto cont

:mode_inc
if *%1 == */jump goto mode_jump
set rev=0000%rev%
set rev=%rev:~-4%
goto cont

:mode_jump
if lbl_%2 == lbl_help set /a rev=%rev%-1
if lbl_%2 == lbl_setup set /a rev=%rev%-1
if lbl_%2 == lbl_finish set /a rev=%rev%-1
set rev=0000%rev%
set rev=%rev:~-4%
goto cont

:cont
set inc=
set appdate=
for /f "skip=2 tokens=2 delims==" %%s in ('find /I "Const vbAppDate" Declarations.bas') do set appdate=%%s
set appdate=%appdate:~2,-1%
set appdate=%appdate:/=-%
for /f "tokens=1,2,3 delims=-" %%a in ("%appdate%") do set a=00%%a
for /f "tokens=1,2,3 delims=-" %%a in ("%appdate%") do set b=00%%b
for /f "tokens=1,2,3 delims=-" %%a in ("%appdate%") do set c=0000%%c
set appdate=%c:~-4%-%a:~-2%-%b:~-2%
set a=
set b=
set c=

:start
echo Project: %prj%, version %major%.%minor% (rev.%rev%), date %appdate%
echo Base path: %base%
echo.

if *%1 == */jump goto lbl_%2

:lbl_res
set cmd="C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\RC.EXE"
echo Rebuild resources...
echo Compiler: %cmd%
if EXIST resources.res erase resources.res >nul
%cmd% resources.rc >nul
ren resources.RES resources.res >nul
set cmd=
echo.

:lbl_exe
set cmd="C:\Program Files\Microsoft Visual Studio\VB98\VB6.EXE"
echo Rebuild project...
echo Compiler: %cmd%
%cmd% /make %prj%.vbp
copy /y %prj%.exe OUTPUT\CLIENT\*.* >nul
set cmd=
echo.

:lbl_help
set cmd="C:\Program Files\Helpman3\helpman.exe"
echo Rebuild help...
echo Compiler: %cmd%
echo COPYRIGHT=© %appdate:~0,4%, alibek>auto_cfg.ini
echo VERSION=%major%.%minor%>>auto_cfg.ini
echo APPDATE=%appdate:~8,2%.%appdate:~5,2%.%appdate:~0,4%>>auto_cfg.ini
type auto_cfg.ini
%cmd% "%prj%.hm3" /hlp="%prj%.hlp" /chm="%prj%.chm" /exe="%prj%-help.exe" /pdf="%prj%.pdf" /V="%base%auto_cfg.ini"
del auto_cfg.ini>nul
copy /y %prj%.cnt OUTPUT\CLIENT\*.* >nul
copy /y %prj%.hlp OUTPUT\CLIENT\*.* >nul
move /y %prj%.chm OUTPUT\CLIENT >nul
move /y %prj%-help.exe OUTPUT\DOC >nul
move /y %prj%.pdf OUTPUT\DOC >nul
set cmd=
echo.

:lbl_setup
set cmd="C:\Program Files\Setup Factory 6.0\SUF60Design.exe"
echo Rebuild setup package...
echo Compiler: %cmd%
echo [Constants]>auto_cfg.ini
echo #OUTPUTDIR#=%base%OUTPUT\CLIENT\SETUP>>auto_cfg.ini
echo #SETUPNAME#=setup.exe>>auto_cfg.ini
echo #VERSION#=%major%.%minor%>>auto_cfg.ini
echo #REVISION#=%rev%>>auto_cfg.ini
echo #BUILD#=demo>>auto_cfg.ini
echo #APPDATE#=%appdate%>>auto_cfg.ini
echo #APPYEAR#=%appdate:~0,4%>>auto_cfg.ini
type auto_cfg.ini
%cmd% Setup.sf6 /B:"%base%auto_cfg.ini" /M
del auto_cfg.ini>nul
set cmd=
echo.

:lbl_finish
set cmd=util\FileTouch.exe
echo Update files timestamp...
echo Tool: %cmd%
set stamp=%appdate:~5,2%-%appdate:~8,2%-%appdate:~0,4%
echo Date: %stamp%
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT >nul
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT\CLIENT >nul
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT\CLIENT\SETUP >nul
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT\DOC >nul
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT\SERVER >nul
%cmd% /W /C /A /S /D %stamp% /T 00:00:00 OUTPUT\SERVER\DATABASE >nul
%cmd% /W /C /A /D %stamp% /T 00:00:00 OUTPUT\*.* >nul
%cmd% /W /C /A /D %stamp% /T 00:00:00 OUTPUT\CLIENT\*.* >nul
%cmd% /W /C /A /D %stamp% /T 00:00:00 OUTPUT\CLIENT\SETUP\*.* >nul
%cmd% /W /C /A /D %stamp% /T 00:00:00 OUTPUT\DOC\*.* >nul
%cmd% /W /C /A /D %stamp% /T 00:00:00 OUTPUT\SERVER\DATABASE\*.* >nul
set stamp=
set cmd=
echo.

:done
set base=
set prj=
set major=
set minor=
set rev=
set appdate=
echo Done.
pause



2. OUTPUT\CLIENT\RUNTIME\install.bat - вручную скопировать и зарегистрировать библиотеки

Код: Выделить всё
@echo off
if not exists %SystemRoot%\system32\MSVBVM60.DLL copy MSVBVM60.DLL %SystemRoot%\system32\*.* >nul
if not exists %SystemRoot%\system32\STDOLE2.TLB  copy STDOLE2.TLB  %SystemRoot%\system32\*.* >nul
if not exists %SystemRoot%\system32\MSCOMCTL.OCX copy MSCOMCTL.OCX %SystemRoot%\system32\*.* >nul
if not exists %SystemRoot%\system32\MSCOMCT2.OCX copy MSCOMCT2.OCX %SystemRoot%\system32\*.* >nul
if not exists %SystemRoot%\system32\MSCOMCT2.OCX copy RICHTX32.OCX %SystemRoot%\system32\*.* >nul
regsvr32 /s %SystemRoot%\system32\MSCOMCTL.OCX >nul
regsvr32 /s %SystemRoot%\system32\MSCOMCT2.OCX >nul
regsvr32 /s %SystemRoot%\system32\RICHTX32.OCX >nul




3. OUTPUT\SERVER\DATABASE\install.bat - Установить базу данных
Запускать необходимо на локальном сервере. Для установки на удаленном сервере нужно изменить строку set srv=(local). Для работы требуются установленные клиентские утилиты SQL Server (а именно osql.exe).
Возможные аргументы:

install.bat [/win]
/win - установку базы данных проводить под текущим пользователем (использовать Windows-авторизацию).

Скрипт database.sql устанавливает базу данных и создает пользователя db_user с паролем db_password.

Код: Выделить всё
@echo off
for /F "delims=*" %%i in ("osql.exe") do set osql=%%~$PATH:i
if not *%osql% == * goto cont
if exist "C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe" set osql="C:\Program Files\Microsoft SQL Server\80\Tools\Binn\osql.exe"
if *%osql% == * goto fail
:cont
set srv=(local)
set dir=%~dp0
echo.
echo Setup GRANTDB database on local MS SQL server.
echo Server      : %srv%
echo SQL-console : %osql%
echo Work dir    : %dir%
if "%1" == "/win" goto cont2
if "%1" == "/WIN" goto cont2
:cont1
echo Mode        : SQL Server authentication
goto cont9
:cont2
echo Mode        : Windows authentication (trusted connection)
goto cont9
:cont9
echo.
echo Press Ctrl+C for cancel and any other key for continue.
pause>nul
if "%1" == "/win" goto win
if "%1" == "/WIN" goto win

:sql
echo Use SQL Server authentication
echo Type password for database administrator (sa).
%osql% -S %srv% -U sa -i "%dir%database.sql" -n
if ERRORLEVEL 1 pause & goto done
echo Loading data, please wait...
%osql% -S %srv% -U db_user -P db_password -i "%dir%data.sql" -n
if ERRORLEVEL 1 pause
goto done

:win
echo Use Windows authentication (trusted connection)
%osql% -S %srv% -E -i "%dir%database.sql" -n
if ERRORLEVEL 1 pause & goto done
echo Loading data, please wait...
%osql% -S %srv% -E -i "%dir%data.sql" -n
if ERRORLEVEL 1 pause
goto done

:fail
echo OSQL.EXE not found in PATH dirs.
echo Setup database manually.
pause

:done
set dir=
set osql=



Последовательность действий при подготовке нового релиза следующая:
1. Увеличить номер версии проекта (minor)
2. Обновить константу vbAppDate в модуле Declarations
3. Обновить версию в файле readme.txt
4. Запустить make_build.bat
5. Записать диск (содержимое каталога OUTPUT), снабдить обложкой
Lasciate ogni speranza, voi ch'entrate.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

    TopList