2008-12-12 53 views
9

我想将源代码的版本号修改为Delphi的源代码和exe版本。什么是自动执行此操作的最佳方法?如何将Subversion版本号纳入Delphi项目

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

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

回答

9

我同意关于$ Revision $的意见不是正确的工具。使用工具从输出提取修订号svninfo确实是正确的事情。

但是也有需要注意两两件事:

  1. SVN信息将只返回正确的信息,如果SVN更新已在目录中签出的源运行。如果您使用自定义构建步骤,则应该为其添加命令。

  2. SVN信息为您提供有关存储库路径也是信息。这是区分中继和其他地方的源的唯一方式,例如标签。如果您希望“关于”框包含一个字符串以正确标识用于构建应用程序的源,请确保存储库路径也可用。

编辑:

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

建议:修改您的构建脚本以更改某些版本文件,然后再进行编译。不知道您使用的构建环境,很难提出更具体的建议。

13

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

+0

这就是我如何使用它。我们之前使用过上面的脚本,但是今天我们创建了一个发布标签,并且由于上面解释的原因,脚本在构建版本中包含了错误的版本号。我的错。我们现在切换到使用SubWCRev.exe。 – 2010-03-09 10:04:43

1

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

因此,坚持在项目顶层的version文件中,您在每个版本上更改/提交,然后阅读以获取版本。

+0

听起来很棒,但我想要获得在文档中讨论的“全局修订”。 – Harriv 2008-12-12 20:52:21

+0

这将不起作用,除非有一些自动的方式来更改该文件,否则它不会被提交,并且版本号不会改变。即使如此,它最好是黑客行为,因为你会得到很多不必要的SVN变化和差异性的污染。 – mghie 2008-12-12 22:24:02

5

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

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

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

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

相关问题