Как включить номер редакции Subversion в проект Delphi - PullRequest
9 голосов
/ 12 декабря 2008

Я хотел бы иметь номер редакции исходного кода для исходного кода Delphi и exe-версии. Каков наилучший способ сделать это автоматически?

Я хотел бы отобразить номер редакции на экране «О программе» и в информации о версии проекта.

В настоящее время я использую Delphi IDE (2006/2007) и Tortoise SVN.

Ответы [ 5 ]

13 голосов
/ 12 декабря 2008

Существует программа под названием SubWCRev.exe, которая поставляется с TortoiseSVN, которая сделает замену токена за вас. Таким образом, где-то в вашем источнике вы вставляете токен и передаете имена файлов ввода и вывода в SubWCRev.exe, и он заменит токен различной информацией SVN, например, номером редакции. Обратите внимание, что это отдельная программа, которую вы можете использовать со своим скриптом сборки, вам не нужно использовать TortoiseSVN с ним.

9 голосов
/ 13 декабря 2008

Я согласен с комментариями о том, что $ Revision $ не является подходящим инструментом для работы. Использование инструмента для извлечения номера ревизии из вывода svn info действительно правильная вещь.

Однако следует отметить еще две вещи:

  1. svn info вернет правильную информацию, только если svn update было запущено в каталоге с установленным из источников. Если вы используете пользовательские шаги сборки, вам, вероятно, следует добавить команду для этого.

  2. svn info также предоставляет информацию о пути к хранилищу. Это единственный способ провести различие между источниками в trunk и где-то еще, как в tags . Если вы хотите, чтобы в поле «О программе» содержалась строка для правильной идентификации источников, использованных для сборки приложения, убедитесь, что путь к репозиторию также доступен.

Edit:

Это командный скрипт, который следует скопировать в каталог верхнего уровня проекта. Он обновит источники из репозитория, получит номер ревизии SVN из вызова svn info и сравнит его с константой SVN_REVISION из файла src \ SvnRev.inc . Если файл отсутствует, он создаст его, если ревизия отличается, он перезапишет его. Если svn недоступен, он запишет номер версии 0 в файл.

Полученный файл src \ SvnRev.inc может быть просто включен в исходный файл. Аналогичный файл может быть создан для включения в ресурс версии.

@echo off

setlocal
rem determine project top level directory from command file name
set PRJDIR=%~dp0
cd %PRJDIR%

set SVNREVFILE=src\SvnRev.inc

rem execute "svn info", extract "Revision: 1234" line, and take SVN rev from there
svn update
for /F " usebackq tokens=1,2 delims=: " %%i in (`svn info`) do set key=%%i&set value=%%j&call :read-svn-rev
@echo SVN revision "%SVNREV%"

rem extract "const SVN_REVISION = 1234;" line, and take header SVN rev from there
for /F " usebackq tokens=2,4 " %%i in (%SVNREVFILE%) do set name=%%i&set value=%%j&call :read-file-rev
@echo Include file revision "%FILEREV%"

rem check for valid SVN rev
if "%SVNREV%" EQU "" goto :no-svn-ref
rem do not write file if SVN ref is equal
if "%FILEREV%" EQU "%SVNREV%" goto :EOF

@echo Writing svn revision %SVNREV% to %SVNREVFILE%
@echo const SVN_REVISION = %SVNREV% ; > %SVNREVFILE%
goto :EOF

:no-svn-ref
if not exist %SVNREVFILE% goto :no-header-file
rem do not write file if SVN ref is already unset
if "%FILEREV%" EQU "0" goto :EOF
@echo Writing svn revision 0 to %SVNREVFILE%
goto :write-no-version

:no-header-file
@echo Creating %SVNREVFILE% with svn revision 0
:write-no-version
@echo const SVN_REVISION = 0 ; > %SVNREVFILE%
goto :EOF

endlocal
goto :EOF

:read-svn-rev
if "%key%" EQU "Revision" set SVNREV=%value%&
goto :EOF

:read-file-rev
if "%name%" EQU "SVN_REVISION" set FILEREV=%value%&
goto :EOF
5 голосов
/ 13 декабря 2008

В комментарии вы упоминаете, что хотите глобальную ревизию, а не ревизию какого-либо конкретного файла. Вы не получите этот номер в ключевом слове, поскольку этот номер не связан ни с одним файлом, а с тем, какой файл был проверен в последнее время где-нибудь в дереве.

Вы можете создать скрипт или небольшую программу, которая запускает svn info и затем анализирует выходные данные, чтобы получить номер ревизии, который вы ищете. Вы можете использовать этот номер вместе с шаблоном файла RC , чтобы вставить номер редакции в запись информации о версии. Этот сгенерированный файл не будет зарегистрирован. Запустите скрипт как часть вашей процедуры MSBuild.

Для версий до MSBuild Delphi создайте группу проектов, а затем сделайте сценарий первым проектом в группе. «Build all» или «Compile all» запустят скрипт перед компиляцией основного проекта.

Вы также можете иметь код в разделе initialization каждого устройства, который добавляет его ревизию (полученную в ответе Ieure) в глобальный список. Затем выберите наибольшее число в списке во время выполнения. Это может дать вам номер для отображения в поле «about», но вы не можете использовать его в информации о версии вашей программы.

1 голос
/ 12 декабря 2008

Если вы используете svn: ключевые слова и включаете $Revision$ в свой файл, он будет обновляться каждый раз, когда файл будет зафиксирован.

Так что вставьте это в version файл на верхнем уровне вашего проекта, который вы изменяете / фиксируете при каждой сборке, и читайте его, чтобы получить версию.

1 голос
/ 12 декабря 2008

Предложение: измените ваши сценарии сборки, чтобы изменить файл версии, который впоследствии будет скомпилирован. Трудно предложить что-то более конкретное, не зная используемой среды сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...