Форум » [x]Harbour » Hbmk2 есть ли фича ? » Ответить

Hbmk2 есть ли фича ?

Dima: Идея такова (автоматическая нумерация сборок). Имеем файлик Build.ch [pre2] #define BUILD 456 [/pre2] Можно как то сказать hbmk2 что бы в этом файле при сборке значение BUILD он увеличивал на 1 ? Лениво а порой просто забываю сменить номер сборки руками. Что то типа опции -tshead , правда это не совсем то.

Ответов - 24, стр: 1 2 All

Sergy: У меня такая штука реализована в текстовом редакторе. Специальный формат строки, внутри размещается дата и инкрементный счетчик. При каждом сохранении счетчик увеличивается на единицу, дата - обновляется. По факту показывает кол-во редактирований файла. Если программа состоит из нескольких модулей - я использую сумму по всем модулям как номер версии. Было-бы интересно реализовать без применения уже немного устаревшего текстового редактора - хоть к нему и привык, но Far + Colorer интереснее.

Dima: Вроде придумал как. Правда без использования Hbmk2.

Sergy: Dima пишет: Вроде придумал как. и не расскажешь ?


Dima: Sergy пишет: и не расскажешь ? Идея пока сырая и если кратко. Сборку проекта я делаю через батник , поэтому до вызова Hbmk2 можно запускать спец прогу (ее сваять еще надо) которая будет считывать md5 или crc32 всех файлов проекта и сравнивать с предыдущим результатом. Результат можно в базе держать или в массиве на диске. Если есть отличия до можно менять содержимое какого ни будь CH файлика где номер сборки будет увеличиваться на 1 ну или еще как то. Вот и все в общих чертах.

Sergy: Хм, идея занятная, нужно будет подумать...

Dima: Sergy пишет: Хм, идея занятная, нужно будет подумать... Давай вместе если не против.

Sergy: Dima пишет: Давай вместе если не против. ok 1) хотелось-бы хранить информацию о файлах проекта максимально компактно. Т.е. в итоге должен получиться exe - 1шт и файл с инфой о проекте - 1шт. Все, что касается проекта - хранить в одном месте. Например, в стиле INI. Часть данных, например список файлов, подлежащих контролю - задает юзер в главной секции. Вторая секция - [do_not_human_modify] будет содержать информацию о датах/размерах файлов и модифицироваться программно.

Dima: В стиле INI не покатит так как из него нужно считывать инфу а я речь веду о том что бы вшить в прогу номер сборки на автомате во время самой сборки проекта. Поэтому вариант с CH файликом самое то на мой выпуклый морской глаз. Прописав его в Main процедуре более ни чего и не надо , до вызова Hbmk2 в батнике "проги" которая пока в теории. Или я тебя не понял ?! PS Имею в виду что после сборки EXE не должен читать ни каких INI так как номерок уже зашит в EXE

Sergy: Dima пишет: Или я тебя не понял ?! Я имел в виду место, в котором программа (пора-бы дать ей уже имя, как например bcheck - Build Check?) будет хранить информацию о дате изменения/размере исходных файлов, входящих в проект. Результатом ее деятельности будет - хоть *.ch, хоть *.prg, хоть вообще *.exe - именно туда будет в результате зашиваться номер сборки.

Dima: Sergy Понял. PS Иногда программист программиста не всегда сразу понимает ;)

Andrey: Делайте через файл ресурса ! Т.е. туда записывать !!! http://clipper.borda.ru/?1-1-0-00000076-000-0-0-1366372867

Andrey_IV: Контролировать для увеличения номера билда все файлы проекта, думаю, что не очень подходит. Если проверять дату и время модификации - то ведь можно что-то исправить, сохранить, а потом передумать и вернуть обратно. При этом нажимая на "Сохранить" в редакторе. Время модификации изменится, но программа по факту - нет. Или вот решили немного причесать исходники и поменять наименование переменных: n1 на nCount1, buf2 на aBuffer2. Т.е. красоту навести, отступы сделать. Исходники проекта изменятся, а программа по факту - нет. Нужно ли в таких случаях увеличивать номер билда ? Если не заморачиваться с ресурсами и для сборки проекта используется батник - то можно его модифицировать и использовать так: 1) Создаем файл "build.set" такого содержания (как пример) VERSION_MAJOR=1 VERSION_MINOR=0 VERSION_BUILD=100 2) Модифицируем батник для сборки проекта (проверено на XP, 2003) @echo off rem Устанавливаем путь к своим исходникам rem Имя файла для хранения версии, релиза, билда - "build.set" rem Имя файла, куда пишется информация о версии перед сборкой rem Это может быть или .CH или .PRG - например "build.ch" set SRC_PATH=D:\Polygon\my_project set BUILD_SET=%SRC_PATH%\build.set set BUILD_CH=%SRC_PATH%\build.ch set EXE_FILE=my_project.exe rem Считываем данные из файла "build.set" rem И устанавливаем значения переменных for /F "eol= delims== tokens=1,2 usebackq" %%i in (%BUILD_SET%) do ( set %%i=%%j ) rem Вот эти 3 строки, что ниже ОЧЕНЬ важны: rem они обрезают пробелы в конце, которые (если не обрезать) rem будут накапливаться в файлах "build.ch" и "build.set" set VERSION_MAJOR=%VERSION_MAJOR: =% set VERSION_MINOR=%VERSION_MINOR: =% set VERSION_BUILD=%VERSION_BUILD: =% rem Увеличиваем номер билда на 1 set /A VERSION_BUILD=VERSION_BUILD + 1 rem Создаем файл "build.ch" call :Make_Build_Ch :BUILD_PROGRAM rem Здесь производим сборку проекта, и если EXE не получили rem то уменьшаем на 1 номер билда (делаем откат) и удаляем "build.ch" rem Можно проверять не просто на наличие EXE, а еще и то rem были ли Error или Warning при сброке. rem Или перед сборкой проекта старый EXE не удалять, rem а копировать под другим именем и потом старый и новый rem проверять MD5 или CRC32 на отличия. Вариантов много. rem Как самое простое - проверяем на наличие EXE rem C:\MiniGUI\Harbour\Bin\hbmk2.exe my_project.hbm if not exist %EXE_FILE% ( set /A VERSION_BUILD=VERSION_BUILD - 1 del %BUILD_CH% ) :UPDATE_BUILD rem Обновляем файл с установками "build.set" call :Update_Build_Set goto EXIT :Make_Build_Ch rem Подпрограмма создания файла "build.ch" rem Можно еще дописать дату и время сборки set BUILD_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2% set BUILD_TIME=%TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2% echo #define VERSION_MAJOR %VERSION_MAJOR% > %BUILD_CH% echo #define VERSION_MINOR %VERSION_MINOR% >> %BUILD_CH% echo #define VERSION_BUILD %VERSION_BUILD% >> %BUILD_CH% echo #define BUILD_DATE %BUILD_DATE% >> %BUILD_CH% echo #define BUILD_TIME %BUILD_TIME% >> %BUILD_CH% exit /b :Update_Build_Set rem Подпрограмма обновления файла "build.set" echo VERSION_MAJOR=%VERSION_MAJOR% > %BUILD_SET% echo VERSION_MINOR=%VERSION_MINOR% >> %BUILD_SET% echo VERSION_BUILD=%VERSION_BUILD% >> %BUILD_SET% exit /b :EXIT 3) В результате получим "build.ch" #define VERSION_MAJOR 1 #define VERSION_MINOR 0 #define VERSION_BUILD 101 #define BUILD_DATE 2013.08.15 #define BUILD_TIME 14:00:03 Это только один из вариантов, как можно сделать. Можно в файле "build.set" хранить данные не так, а, например, в виде одной строки: 1.0.100 Изменится только разбор в цикле "for" Или вообще не делать отдельный "build.set", а информацию хранить сразу в "build.ch" Я похожим батником пользуюсь при сборке собственной библиотеки Только пишу не в .CH , а в .PRG в виде функции, которая хранит массив с информацией об имени библиотеки, версии, сборке, дате, времени. Получаю вот такой .PRG модуль и собираю его в библиотеку: #include "common.ch" FUNCTION GetLibBuildInfo(nElement) LOCAL aArray[5] aArray[1] := "my_lib" aArray[2] := "1.0.1.682" aArray[3] := STOD("20130815") aArray[4] := "11:58:30" aArray[5] := 1000100682 IF .NOT.ISNIL(nElement) .AND. ISNUMBER(nElement) RETURN (aArray[nElement]) ENDIF RETURN (aArray)

Dima: Andrey_IV Оригинальное решение , спасибо !

Sergy: Andrey_IV, мощно, респект!

Andrey_IV: При формировании "build.ch" значения BUID_DATE и BUILD_TIME нужно взять в кавычки echo #define BUILD_DATE "%BUILD_DATE%" >> %BUILD_CH% echo #define BUILD_TIME "%BUILD_TIME%" >> %BUILD_CH%

Sergy: Правильно ли я понимаю, что можно отказаться от "выковыривания" переменных из файла build.set, заменив его на build_set.bat такого содержания: set VERSION_MAJOR=1 set VERSION_MINOR=2 set VERSION_BUILD=654 И вызовом CALL BUILD_SET.BAT вместо конструкции "for /F eol... Delims... +последующей обрезки. И соотв. перезаписью после сборки?

Andrey_IV: Да, совершенно верно - будет Но обрезать строки от пробелов все равно придется set VERSION_MAJOR=%VERSION_MAJOR: =% set VERSION_MINOR=%VERSION_MINOR: =% set VERSION_BUILD=%VERSION_BUILD: =% Пробелы накапливаются. Почему так происходит, я так и не понял В документации по CMD и интернете никакого внятного ответа не нашел. Просто принял за факт. Данные в кавычках такого эффекта не дают Но нам-то нужны именно цыфры На всякий случай проверил - вот такой батник получается: build_set.bat set VERSION_MAJOR=1 set VERSION_MINOR=0 set VERSION_BUILD=107 build2.bat @echo off rem Устанавливаем путь к своим исходникам rem Имя файла для хранения версии, релиза, билда - "build_set.bat" rem Имя файла, куда пишется информация о версии перед сборкой rem Это может быть или .CH или .PRG - например "build.ch" set SRC_PATH=D:\Polygon\Build set BUILD_SET=%SRC_PATH%\build_set.bat set BUILD_CH=%SRC_PATH%\build.ch set EXE_FILE=%SRC_PATH%\prog.exe rem Считываем данные из файла "build_set.bat" CALL build_set.bat rem Вот эти 3 строки, что ниже ОЧЕНЬ важны: rem они обрезают пробелы в конце, которые (если не обрезать) rem будут накапливаться в файлах "build.ch" и "build.set" set VERSION_MAJOR=%VERSION_MAJOR: =% set VERSION_MINOR=%VERSION_MINOR: =% set VERSION_BUILD=%VERSION_BUILD: =% rem Увеличиваем номер билда на 1 set /A VERSION_BUILD=VERSION_BUILD + 1 rem Создаем файл "build.ch" call :Make_Build_Ch :BUILD_PROGRAM rem Здесь производим сборку проекта, и если EXE не получили rem то уменьшаем на 1 номер билда и удаляем "build.ch" rem Можно проверять не просто на наличие EXE, а еще и то rem были ли Error или Warning при сброке. rem Или перед сборкой проекта старый EXE не удалять, rem а копировать под другим именем и потом старый и новый rem проверять MD5 или CRC32 на отличия. Вариантов много. rem Как самое простое - проверяем на наличие EXE rem C:\MiniGUI\Harbour\Bin\hbmk2.exe my_project.hbm if not exist %EXE_FILE% ( set /A VERSION_BUILD=VERSION_BUILD - 1 del %BUILD_CH% ) :UPDATE_BUILD rem Обновляем файл с установками "build_set.bat" call :Update_Build_Set_Bat goto EXIT :Make_Build_Ch rem Подпрограмма создания файла "build.ch" rem Можно еще дописать дату и время сборки set BUILD_DATE=%DATE:~6,4%.%DATE:~3,2%.%DATE:~0,2% set BUILD_TIME=%TIME:~0,2%:%TIME:~3,2%:%TIME:~6,2% echo #define VERSION_MAJOR %VERSION_MAJOR% > %BUILD_CH% echo #define VERSION_MINOR %VERSION_MINOR% >> %BUILD_CH% echo #define VERSION_BUILD %VERSION_BUILD% >> %BUILD_CH% echo #define BUILD_DATE "%BUILD_DATE%" >> %BUILD_CH% echo #define BUILD_TIME "%BUILD_TIME%" >> %BUILD_CH% exit /b :Update_Build_Set_Bat rem Подпрограмма обновления файла "build_set.bat" echo set VERSION_MAJOR=%VERSION_MAJOR% > %BUILD_SET% echo set VERSION_MINOR=%VERSION_MINOR% >> %BUILD_SET% echo set VERSION_BUILD=%VERSION_BUILD% >> %BUILD_SET% exit /b :EXIT Вообще в случае с батниками, все зависит только от собсвенной фантазии Т.е. храни данные в каком угодно файле - лишь бы текстовый был

Sergy: Вот что умеет hbmk2 в версии 3.2: [pre2] -vcshead=<file> generate .ch header file with local repository information. Git, SVN, Mercurial, Bazaar, Fossil, CVS and Monotone are currently supported. Generated header will define preprocessor constant _HBMK_VCS_TYPE_ with the name of detected VCS and _HBMK_VCS_ID_ with the unique ID of local repository. If no VCS system is detected, a sequential number will be rolled automatically on each build. и -tshead=<file> generate .ch header file with timestamp information. Generated header will define preprocessor constants _HBMK_BUILD_DATE_, _HBMK_BUILD_TIME_, _HBMK_BUILD_TIMESTAMP_ with the date/time of build[/pre2] задав команды -vcshead=one -tshead=two Получил два *.ch файла: /* Automatically generated by hbmk2. Do not edit. */ #define _HBMK_VCS_TYPE_ "hbmk" #define _HBMK_VCS_ID_ "2" /* Automatically generated by hbmk2. Do not edit. */ #define _HBMK_BUILD_DATE_ "20130820" #define _HBMK_BUILD_TIME_ "181138" #define _HBMK_BUILD_TIMESTAMP_ "20130820181138166" Ну не офигеть, а ?

Dima: Sergy пишет: -vcshead=<file> Создает файлик CH в котором есть строка #define _HBMK_VCS_ID_ В этом файле эту строку я исправил на (просто затестил) #define _HBMK_VCS_ID_ "36.3" И при следующей сборке в нем получил 37.3

Andrey: Dima пишет: В этом файле эту строку я исправил на (просто затестил) #define _HBMK_VCS_ID_ "36.3" И при следующей сборке в нем получил 37.3 А как получить автоинкремент на 0.01 ? И еще вопрос, можно ли эти параметры записывать в ресурсный файл проги ? В строку: VALUE "FileVersion", "1.0"



полная версия страницы