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

时间:2008-12-12 20:23:21

标签: svn delphi

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

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

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

5 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:9)

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

还有两件事需要注意:

    如果 svn 更新已在带有签出源的目录。如果您使用自定义构建步骤,则应该为其添加命令。

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

  2. 修改

    这是一个应该复制到项目顶级目录的命令脚本。它将更新存储库中的源代码,从 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
    

答案 2 :(得分:5)

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

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

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

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

答案 3 :(得分:1)

建议:修改构建脚本以更改之后编译的某个版本文件。如果不了解您正在使用的构建环境,很难提出更具体的建议。

答案 4 :(得分:1)

如果您使用svn:keywords并在文件中包含$Revision$,则每次提交该文件时都会更新。

请将其粘贴到项目顶层的version文件中,您可以在每个版本中更改/提交,并将其读入以获取版本。