10

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

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

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

到目前为止,我已经成功地用来svnversion获取最新版本的工作副本作为预建事件

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

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

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

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

_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 环境中更新变量。所以我采取了另一条路线,调用脚本作为预构建步骤,获取工作副本的 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

4 回答 4

6

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

例如,我创建了一个批处理脚本version.bat

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

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

于 2012-08-21T15:44:55.760 回答
3

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

Jenkins 的巧妙技巧之一是插入一些不错的环境变量供您使用:

  • SVN_REVISION - Subversion 版本号
  • BUILD_NUMBER - Jenkins 中的内部版本号
  • JOB_NAME - Jenkins 中的作业名称

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

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

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

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

于 2012-08-21T15:26:26.170 回答
1

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

#define SVN_REV 12345

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

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

于 2012-08-21T15:14:20.513 回答
1

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

关于 SVN 的棘手问题:在旧版本中(每个子目录中都有一个 .svn 文件),版本号只能保证项目根目录的正确性。任何其他目录都将包含该子树中最后一次提交的版本号。我不知道你使用的是什么版本,但如果你是几个 revs back,请注意这一点!

于 2012-08-21T19:32:30.510 回答