代码之家  ›  专栏  ›  技术社区  ›  Harriv

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

  •  9
  • Harriv  · 技术社区  · 17 年前

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

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

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

    5 回复  |  直到 17 年前
        1
  •  9
  •   mghie    17 年前

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

        2
  •  13
  •   D'Arcy Rittich    16 年前

    我同意以下评论 $修订$ 不是做这项工作的合适工具。使用工具从输出中提取修订号 svn 信息 这确实是正确的做法。

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

    1. svn 信息 只有在以下情况下才会返回正确的信息 svn 更新 已在已签出源代码的目录上运行。如果你使用自定义构建步骤,你可能也应该为它添加一个命令。

    2. svn 信息 还为您提供有关存储库路径的信息。这是区分来源的唯一方法 树干 还有别的地方,比如 标签 。如果希望“关于”框包含一个字符串,以正确标识用于构建应用程序的源,请确保存储库路径也可用。

    编辑:

    这是一个应复制到项目顶层目录的命令脚本。它将从存储库更新源代码,从 获取当前检出的版本信息 调用它并将其与文件中的常量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
    
        3
  •  5
  •   Rob Kennedy    17 年前

    在评论中,你提到你想要全局修订,而不是任何特定文件的修订。你不会在关键字中得到这个数字,因为这个数字与任何一个文件都没有关系,而是与最近在树中任何地方签入的文件有关。

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

    对于MSBuild Delphi之前的版本,创建一个项目组,然后将脚本设置为该组中的第一个项目。“全部构建”或“全部编译”将在编译主项目之前运行脚本。

    你也可以在每个单元中都有代码 initialization 将其修订(根据Ieure的答案)添加到全局列表中的部分。然后在运行时选择列表中的最高数字。这可以让你在“关于”框中显示数字,但你不能在程序的版本信息中使用它。

        4
  •  1
  •   Vilx-    17 年前

    建议:修改您的构建脚本,以更改稍后编译的版本文件。在不了解您使用的构建环境的情况下,很难提出任何更具体的建议。

        5
  •  1
  •   ieure    17 年前

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

    所以把它放在一个 version 在项目的顶级文件中,您可以在每次构建时更改/提交该文件,并读取该文件以获取版本。