在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%
答案 0 :(得分:5)
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的一个巧妙的技巧是插入一些很好的环境变量供你使用:
一旦你开始使用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文件),版本号只能保证对项目根目录正确。任何其他目录都将承载该子树中最后一次提交的版本号。我不知道你正在使用什么版本,但要注意,如果你是一对夫妇回来!