在应用程序版本中使用svn版本号

时间:2012-08-21 14:36:07

标签: c++ visual-studio-2010 svn continuous-integration

在VS2010解决方案(非.NET)中,我希望将svn修订版号作为应用程序版本的一部分。

我们目前不使用makefile,只使用VS解决方案/项目设置。

我想在编译时获取工作副本修订号,将其存储到变量中,以便稍后可以在代码中使用它来显示版本号。

到目前为止,我已成功使用svnversion将最新版本的工作副本作为预建事件

"C:\Program Files\CollabNet\Subversion Client\svnversion.exe" -n $(SolutionDir)

在构建时,我可以看到正确的修订号返回到output控制台。

现在,问题是,如何将此值存储到可在代码中使用的变量中?

我已经尝试定义预编译器变量(_SVNREV)并使用它直接从pre-build事件框中保存上面cmd的结果,但这不起作用。< / p>

_SVNREV="C:\Program Files\CollabNet\Subversion Client\svnversion.exe" -n $(SolutionDir)
%_SVNREV%="C:\Program Files\CollabNet\Subversion Client\svnversion.exe" -n $(SolutionDir)
%_SVNREV="C:\Program Files\CollabNet\Subversion Client\svnversion.exe" -n $(SolutionDir)
$(_SVNREV)="C:\Program Files\CollabNet\Subversion Client\svnversion.exe" -n $(SolutionDir)

这些都不起作用。

解决: 我正试图从VS env中更新变量。所以我采用了另一种方法,将脚本称为预构建步骤,获取工作副本的svn修订版,然后创建包含该信息的头文件。

以下是感兴趣的人svnrev.bat

@echo off
set cmd="C:\"Program Files\CollabNet\Subversion Client"\svnversion.exe -n %1 "
set versionfile=%1/version.h
FOR /F %%i IN ('%cmd%') DO SET SVNVER=%%i

echo Detected program revision %SVNVER% in %1
echo #pragma once > %versionfile%
echo #define _SVNVER "%SVNVER%" >> %versionfile%

4 个答案:

答案 0 :(得分:5)

到目前为止我想出的最好的猜测是在包含svnversion的预构建事件中生成头文件。

e.g。我创建了一个批处理脚本version.bat

@echo off
FOR /F "tokens=*" %%i IN ('call svnversion') DO echo #define SVNVERSION "%%i" > svnversion.h

无论我想要获得svnversion,我只需#include "svnversion.h"

答案 1 :(得分:3)

如果你正在进行构建,那么你应该有一个标准的构建系统。我建议使用Jenkins。它是开源的,易于使用。

Jenkins的一个巧妙的技巧是插入一些很好的环境变量供你使用:

  • SVN_REVISION - Subversion修订号
  • BUILD_NUMBER - Jenkins中的内部版本号
  • JOB_NAME - Jenkins中的职位名称

一旦你开始使用Jenkins进行构建,后两个环境变量可能会比Subversion修订本身更有价值,因为后两个会将你的代码链接回项目,以及各种好的信息。

Jenkins是一个持续构建的引擎。您可以设置Jenkins作业,以便在结帐时或在一天中的某些时间构建命令。您甚至可以通过URL上的wget发送构建命令。

通过使用构建服务器,您可以消除特定系统的配置对构建产生某种副作用的可能性。构建服务器是一种已知配置,将生成官方版本。

这比您可能想知道的要多一些。 (具体来说,您可以使用svnversion命令检索修订号,然后从那里继续)。但是,它将大大改善您的构建过程。

答案 2 :(得分:1)

您可以运行包含在批处理文件中的命令。批处理文件可以生成类似于version.h的头文件,其中包含版本字符串:

#define SVN_REV 12345

批处理脚本回显“#define SVN_REV”。 SVN rev来自您拥有的命令。

现在,您可以在代码中包含此标头,并根据需要使用#define。

答案 3 :(得分:0)

我见过人们为版本号解析svn信息并将其写入文件,然后设置编译以将文件粘贴到编译的代码中。

关于SVN的棘手问题:在旧版本中(每个子目录中都有.svn文件),版本号只能保证对项目根目录正确。任何其他目录都将承载该子树中最后一次提交的版本号。我不知道你正在使用什么版本,但要注意,如果你是一对夫妇回来!