我想实现一种在代码中记录项目版本的方法,以便在测试时使用它并帮助跟踪错误。似乎最好使用的版本号就是 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
虽然很漂亮,但修订关键字技巧仅在该修订中更改文件时才更新文件 - 如果您不更改文件,那么它将继续反映旧修订。
如果您希望软件始终反映总体修订号,那么您必须深入研究相关的 SVN 条目文件并提取它,这并不太难(它是一个 XML 文件)。
维基百科在他们的版本页面上这样做是为了表明正在运行的软件的版本;代码在这里- 寻找getSvnRevision()方法。
您也可以使用属于 TortoiseSVN 的 SubWCRev。
SubWCRev 是 Windows 控制台程序,可用于读取 Subversion 工作副本的状态,并可选择在模板文件中执行关键字替换。这通常用作构建过程的一部分,作为将工作副本信息合并到您正在构建的对象中的一种方式。通常,它可能用于在“关于”框中包含修订号。
http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-subwcrev.html
在您的 Makefile 中,添加:
SVNDEV := -D'SVN_REV="$(shell svnversion -n .)"'
CFLAGS := $(SVNDEV) ...
然后您可以在代码中的任何位置使用宏SVN_REV
,例如:
printf ("Version: SVN %s\n", SVN_REV);
您可以使用该svn:keywords
属性来启用Rev
关键字。
然后您可以$Rev$
在您的代码中使用,SVN 将在更新时自动扩展它$Rev: 256 $
,然后可以解析...
一个很好的最新解决方案:
创建一个Makefile
包含以下行(在与 相同的文件夹中YourFile.dox
):
sed "s~RevNumber~$(shell svnversion ../)~g" YourFile.dox > YourFileDummy.dox; doxygen YourFileDummy.dox
并且YourFile.dox
应该包含这个:
...
PROJECT_NUMBER = "Revision RevNumber"
...
现在:
sed
用(在存储库的主文件夹中执行)的输出替换RevNumber
.doxsvnversion
并将修改后的文件保存到YourFileDummy.dox
doxygen
执行YourFileDummy.dox
以生成文档