【问题标题】:How to include Subversion revision number into Delphi project如何将 Subversion 修订号包含到 Delphi 项目中
【发布时间】:2010-09-26 17:08:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: svn delphi


    【解决方案1】:

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

    【讨论】:

    • 我就是这样使用它的。我们之前使用过上面的脚本,但今天我们创建了一个发布标签,由于上述原因,该脚本在构建中包含了错误的版本号。我的错。我们现在改用 SubWCRev.exe。
    【解决方案2】:

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

    还有两点需要注意:

    1. svn info 只有在 svn update 已在带有签出源的目录。如果您使用自定义构建步骤,您可能也应该为它添加一个命令。

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

    编辑:

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

    【讨论】:

    • 我发现这不能正常工作。我认为原因可能是因为我的工作副本总是包含我完整的项目结构,包括标签和分支。因此,脚本将全局获取最后一次更改的修订号,而不仅仅是执行它的文件夹。另一方面,SubWCRev.exe 在我的使用场景中完美运行。
    • @Timo:它当然可以正常工作,尽管它可能无法达到您的预期。此脚本返回全局修订,这是 OP 要求的。我从来没有声称这会返回最后一次提交修订,这当然是不同的。不过,感谢您的反对。
    • @mghie:重新阅读您的答案后,我承认,是的,您是对的。您从未声称它将返回当前工作副本的最后一次提交修订。因此,我删除了我的反对票。这对我来说仍然不是正确的解决方案,但我相信其他人发现这个答案很有用。
    • @mghie:我试图删除我的反对票,但它说:“投票太旧而无法更改,除非编辑此答案”。很抱歉。
    • @Timo:如果 SubWCRev 适合你,那就太好了。但是我不明白为什么脚本 适合你。如果 rev 42 是更改您的分支的最后一次提交,那么您的工作副本具有哪个修订版完全不相关,只要它至少为 42 - 构建在该分支上的代码将与以后的 any 完全相同修订为好。这就是为什么提交修订没有意义,与某个修订一起使用的存储库路径很重要。您要求您的内部版本号是最后一个 commit 修订版,我不知道您为什么会关心。
    【解决方案3】:

    在您提到的评论中,您想要全局修订,而不是任何特定文件的修订。您不会在关键字中获得该数字,因为该数字与任何一个文件都不相关,而是与树中最近签入的任何文件相关。

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        因此,请将其粘贴在项目顶层的 version 文件中,您可以在每次构建时更改/提交该文件,然后将其读入以获取版本。

        【讨论】:

        • 听起来不错,但我想获得文档中讨论的“全局修订”。
        • 这将不起作用,除非有某种自动方式来更改该文件,否则它将不会被提交,并且修订号也不会改变。即便如此,它充其量只是一个 hack,因为你会得到很多不必要的 SVN 更改和差异污染。
        猜你喜欢
        • 1970-01-01
        • 2012-02-27
        • 2010-09-11
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多