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

use svn revision number in application version

本文关键字:svn 应用程序 版本      更新时间:2023-10-16

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

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

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

到目前为止,我已经成功地使用svnversion作为预构建事件获得了工作副本的最新版本。

"C:Program FilesCollabNetSubversion Clientsvnversion.exe" -n $(SolutionDir)

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

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

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

_SVNREV="C:Program FilesCollabNetSubversion Clientsvnversion.exe" -n $(SolutionDir)
%_SVNREV%="C:Program FilesCollabNetSubversion Clientsvnversion.exe" -n $(SolutionDir)
%_SVNREV="C:Program FilesCollabNetSubversion Clientsvnversion.exe" -n $(SolutionDir)
$(_SVNREV)="C:Program FilesCollabNetSubversion Clientsvnversion.exe" -n $(SolutionDir)

这些都不起作用。

解决方案:我试图从VS环境中更新一个变量,但没有去任何地方。所以我采取了另一种方法,调用一个脚本作为预构建步骤,获取工作副本的svn修订版,然后创建一个包含该信息的头文件。

以下是感兴趣的人的svnrev.bat

@echo off
set cmd="C:"Program FilesCollabNetSubversion 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%

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

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

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

无论我想在哪里获得sversion,我只需#include "svnversion.h"

如果您正在进行构建,您应该有一个标准的构建系统。我建议使用詹金斯。它是开源的,并且易于使用。

詹金斯的一个巧妙技巧是插入一些不错的环境变量供您使用:

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

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

Jenkins是一个持续构建引擎。无论何时结账,或者在一天中的特定时间,您都可以设置Jenkins作业以基于命令进行构建。您甚至可以通过URL上的wget发送构建命令。

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

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

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

#define SVN_REV 12345

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

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

我见过有人解析svn信息以获取版本号,并将其写入一个文件,然后设置compile以将文件拖入编译后的代码中。

SVN的诀窍:在旧版本中(每个子目录中都有一个.SVN文件),版本号只能保证对项目根目录是正确的。任何其他目录都将带有该子树中最后一次提交的版本号。我不知道你用的是什么版本,但如果你是一对情侣,请注意!