假设我有一个构建 exe 或 dll 文件的 C++ 项目。该项目已经提交到 SVN 存储库中。我希望自动将 SVN 中的版本号与嵌入在我的 exe/dll 文件中的版本信息同步,即版本号应该类似于 $major.$minor.$svn_revision。
有什么想法可以实现这个功能吗?是否有现成的解决方案可用?
假设我有一个构建 exe 或 dll 文件的 C++ 项目。该项目已经提交到 SVN 存储库中。我希望自动将 SVN 中的版本号与嵌入在我的 exe/dll 文件中的版本信息同步,即版本号应该类似于 $major.$minor.$svn_revision。
有什么想法可以实现这个功能吗?是否有现成的解决方案可用?
SubWCRev
。$WCREV$
如果你执行类似于这样的操作,它将被替换为最高提交的修订号:
SubWCRev .\ yourfile.txt.template yourfile.txt
这将从yourfile.txt.template
复制,进行替换,然后写入yourfile.txt
。
请注意,还有很多其他的宏可以使用,如果您执行SubWCRev
而没有任何参数,则会在控制台上列出所有可用的宏。
Program.X的答案非常好。但是我想补充一点,如果在提交更改之前构建可执行文件,则修订版本将比运行代码的实际修订版本号少1。为了减轻这种情况,您可以设置版本为
"2.0.$WCREV$.$WCMODS?1:0$"
[assembly: AssemblyVersion("2.0.0.$WCREV$")]
[assembly: AssemblyFileVersion("2.0.0.$WCREV$")]
4/ 将以下内容添加到预生成事件中:
SubWCRev $(SolutionDir) $(ProjectDir)\Build\AssemblyInfo.cs.txt $(ProjectDir)\Properties\AssemblyInfo.cs
$KeywordName: ...$
部分。自定义属性提供了一种很好的方法,可以在批处理文件等中提供元数据。svn info
的输出中提取当前修订版。SET rootdir=%1
SET svnrev=0
PUSHD "%rootdir%"
FOR /F "tokens=1-4 delims=: " %%I IN ('svn info') DO (
IF /I {%%I}=={rev} SET svnrev=%%L
)
(ECHO./*
ECHO. * version-stamp.h - repository version information
ECHO. */
ECHO.#ifndef VERSION_STAMP_H
ECHO.#define VERSION_STAMP_H
ECHO.#define REPOSITORY_VERSION %svnrev%
ECHO.#endif) > include\version-stamp.h
POPD
component-info.h
,大致如下:#ifndef component_info_h
#define component_info_h
#include "product-info.h"
#include "version-stamp.h"
#define VERS_MAJOR 1
#define VERS_MINOR 2
#define VERS_PATCH 3
#define VERS_BUILD REPOSITORY_VERSION
#define MY_COMPONENT_NAME "TPS Report Generator"
#define MY_VERSION_NUMBER VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD
#define MY_VERSION_STRING VERSION_STRING(VERS_MAJOR,VERS_MINOR,VERS_PATCH,VERS_BUILD)
#endif
product-info.h
的产品信息。#ifndef product_info_h
#define product_info_h
#define PROD_VERS_MAJOR 0
#define PROD_VERS_MINOR 1
#define PROD_VERS_PATCH 0
#define PROD_VERS_BUILD 0
#define VSTR1(s) #s
#define VSTR(s) VSTR1(s)
#define VERSION_STRING(a,b,c,d) VSTR(a) "." VSTR(b) "." VSTR(c) "." VSTR(d) "\0"
#define MY_COMPANY_NAME "IniTech\0"
#define MY_COPYRIGHT "Copyright ©2009 " MY_COMPANY_NAME
#define MY_PRODUCT_NAME "\0"
#define MY_PRODUCT_VERSION_NUM PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD
#define MY_PRODUCT_VERSION_STR VERSION_STRING(PROD_VERS_MAJOR,PROD_VERS_MINOR,PROD_VERS_PATCH,PROD_VERS_BUILD)
#endif
component-info.h
,并在适当的位置使用各种定义(例如FILEVERSION MY_VERSION_NUMBER
)。这种结构为我们提供了很多灵活性和整个版本标记过程的可追溯性。它从批处理文件中的简单块发展成为这种多级怪物,但在过去几年中它一直非常有效。.rules
文件,定义一个处理此问题的自定义工具。
SubWCRev
已经静态编译了,所以你只需要 exe 文件,而不需要一堆 TortoiseSVN DLLs。 - Craig McQueen