我希望能够在代码中实现记录项目版本的方法,以便在测试和跟踪错误时使用。看起来最好使用的版本号应该是从Subversion获取的当前修订号。是否有一种简单的方法将这个数字连接到一个(在我这种情况下是C++)头文件或其他文件中,然后我可以在代码中使用?我想这可能是一个提交后钩子之类的东西吧?
请问有没有任何实现此功能的经验(请提供代码分享),或者可以建议更好的替代方案?谢谢。
两种方法:
一是在代码中嵌入$Id$或$Revision$,然后设置文件的svn:keywords="Id Revision" 属性。这将显示该源文件的最后修改版本。适用于较小的项目和脚本。
另一种方法是使用Makefile驱动的过程和命令行工具svnversion。(语言相关-这适用于C/C++)
echo -n "#define VERSION 1.0.1-" > version.h
svnversion -n . >> version.h
或使用一些更复杂的构建脚本,其中包括sed和version.h.in。然后只需#include version.h
这将为您提供存储库版本号,该版本号将在每次提交/更新时更改,并且对于大多数项目来说可能是更合适的版本号。
注意:我还使用了一个手动更新的可读性较高的版本字符串。此示例将给出:版本:1.0.1-r13445
〜J
您也可以使用 TortoiseSVN 中的 SubWCRev。
SubWCRev 是一个 Windows 命令行程序,可用于读取 Subversion 工作副本的状态,并在模板文件中进行关键字替换(可选)。这通常作为构建过程的一部分使用,作为将工作副本信息合并到正在构建的对象中的一种方式。通常它可以被用于在“关于”框中包含版本号。
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
虽然巧妙,但是revision关键字技巧只在该版本中更改文件时更新文件 - 如果您不更改文件,则它将继续反映旧版本。
如果您希望软件始终反映总的修订号,则必须深入研究相关的SVN条目文件并提取它,这并不难(它是一个XML文件)。
维基百科在其版本页面上执行此操作以指示正在运行的软件的修订版本; 代码位于此处 - 查找getSvnRevision() 方法。
SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...
那么你可以在代码中的任何地方使用宏 SVN_REV
,例如:
printf ("Version: SVN %s\n", SVN_REV);
svn:keywords
属性来启用Rev
关键字。$Rev$
,当更新到$Rev: 256 $
时,SVN会自动展开它,然后进行解析...YourFile.dox
相同的文件夹中创建一个包含以下行的 Makefile
:sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox
并且YourFile.dox
应该包含如下内容:
...
PROJECT_NUMBER = "Revision RevNumber"
...
sed
将 .dox 中的 RevNumber
替换为 svnversion
的输出(在您的代码库的主文件夹中执行),并将修改后的文件保存为 YourFileDummy.dox
YourFileDummy.dox
执行 doxygen
以生成文档[Subversion]
Revision = "$Revision: $"
Author = "$Author: $"
Date = "$Date: $"
HeadURL = "$HeadURL: $"