当前位置:  开发笔记 > 编程语言 > 正文

如何在Delphi项目中包含Subversion修订版号

如何解决《如何在Delphi项目中包含Subversion修订版号》经验,为你挑选了3个好方法。

我想将Delphi的源代码和exe版本的源代码修订版.自动执行此操作的最佳方法是什么?

我想在"关于"屏幕和项目的版本信息中显示修订号.

我正在使用Delphi IDE(2006/2007)和Tortoise SVN.



1> RedFilter..:

TortoiseSVN附带了一个名为SubWCRev.exe的程序,可以替换令牌.因此,在源代码中的某处,插入令牌,并将输入和输出文件名传递给SubWCRev.exe,它将使用各种SVN信息(例如版本号)替换令牌.注意,这是一个可以与构建脚本一起使用的独立程序,您不需要使用TortoiseSVN.



2> mghie..:

我同意关于$ Revision $的评论不适合这项工作.使用工具从svn info的输出中提取修订版号确实是正确的做法.

然而,还有两件事需要注意:

    如果已在签出源的目录上运行svn update,svn info将仅返回正确的信息.如果您使用自定义构建步骤,您可能应该为它添加命令.

    svn info还提供有关存储库路径的信息.这是区分trunk和其他地方的源的唯一方法,比如标签.如果希望"关于"框包含一个字符串以正确识别用于构建应用程序的源,请确保存储库路径也可用.

编辑:

这是一个应该复制到项目顶级目录的命令脚本.它将更新存储库中的源代码,从svn info调用中获取SVN修订版号,并将其与文件src\SvnRev.inc中的常量SVN_REVISION进行比较.如果文件丢失,它将创建它,如果修订版本不同,它将覆盖它.如果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



3> Rob Kennedy..:

在评论中,您提到您需要全局修订,而不是任何特定文件的修订.您不会在关键字中获取该数字,因为该数字与任何一个文件无关,而是最近最近在树中的任何位置检查过的文件.

您可以创建一个运行的脚本或小程序,svn info然后解析输出以获取您之后的修订版号.您可以将该数字与RC文件的模板结合使用,以在版本信息记录中插入修订号.不会签入此生成的文件.将脚本作为MSBuild过程的一部分运行.

对于MSBuild之前的Delphi版本,创建一个项目组,然后将该脚本作为该组中的第一个项目."Build all"或"Compile all"将在编译主项目之前运行脚本.

您还可以在每个单元的initialization部分中添加代码,将其修订版(由Ieure的答案获得)添加到全局列表中.然后在运行时选择列表中的最大数字.这可以为您显示在"关于"框中显示的数字,但您无法在程序的版本信息中使用它.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有