每次新版本build时,让软件的版本号自增

VC2005利用SVN的版本号,生成DLL和EXE文件的版本号

TortoiseSVN下有一个SubWCRev程序,可以获取任意个路径对应的SVN版本库的版本号。并替换到文件对应位置。

VC2005的资源文件可以控制生成的二进制文件版本号。

可以利用VC2005的生成前命令,调用SubWCRev来获取最新的SVN版本号并写入生成的二进制文件中。

程序也可以判断调用的DLL版本号是否比本身大。以控制不会调用不对应的动态库。可以使依赖多了一层运行时保证。

实现该目的,需要

  • 每次编译前,从svn获取当前版本库的版本号,并写入资源文件
  • 编译完成后,打安装包时,读取版本信息

需要注意两点:

1,svn的工具可获取版本号并更新到项目文件

如果提供了源文件和目的文件,SubWCRev 会复制源文件到目标文件,执行如下所属的关键字替换:

表 5.2. 列出可用的命令行开关

关键字 描述
$WCREV$ 工作副本中最高的提交版本来替换
$WCDATE$ 用最高提交版本的日期/时间替换。默认使用国际化格式:yyyy-mm-dd hh:mm:ss。作为选择,你可以指定strftime()使用自定义格式,例如:$WCDATE=%a %b %d %I:%M:%S %p$。格式字符的列表参见在线引用
$WCNOW$ Replaced with the current system date/time. This can be used to indicate the build time. Time formatting can be used as described for$WCDATE$.
$WCRANGE$ 在工作目录用更新版本范围替换。如果工作目录处于一致的状态,它是一个单一版本。如果工作目录包含混合版本,或者是过时,或者是故意更新到版本,那么这个范围会用象100:200这样的格式来显示。
$WCMIXED$ 当有混合版本时用TText替换$WCMIXED?TText:FText$,否则用FText替换。
$WCMODS$ 若本地存在修改,就用TText替换$WCMODS?TText:FText$,否则用FText替换。
$WCURL$ 用传递给SubWCRev的工作目录的版本库地址替换。
$WCINSVN$ $WCINSVN?TText:FText$is replaced withTTextif the entry is versioned, orFTextif not.
$WCNEEDSLOCK$ $WCNEEDSLOCK?TText:FText$is replaced withTTextif the entry has thesvn:needs-lockproperty set, orFTextif not.
$WCISLOCKED$ $WCISLOCKED?TText:FText$is replaced withTTextif the entry is locked, orFTextif not.
$WCLOCKDATE$ Replaced with the lock date. Time formatting can be used as described for$WCDATE$.
$WCLOCKOWNER$ Replaced with the name of the lock owner.
$WCLOCKCOMMENT$ Replaced with the comment of the lock.

下面的例子显示了模版文件中的关键字是如何在输出文件中被替换的。

// Test file for SubWCRev: testfile.tmpl

char *Revision = "$WCREV$";
char *Modified = "$WCMODS?Modified:Not modified$";
char *Date     = "$WCDATE$";
char *Range    = "$WCRANGE$";
char *Mixed    = "$WCMIXED?Mixed revision WC:Not mixed$";
char *URL      = "$WCURL$";

#if $WCMODS?1:0$
#error Source is modified
#endif

// End of file

After runningSubWCRev.exe path\to\workingcopy testfile.tmpl testfile.txt, the output filetestfile.txtwould looks like this:

// Test file for SubWCRev: testfile.txt

char *Revision = "3701";
char *Modified = "Modified";
char *Date     = "2005/06/15 11:15:12";
char *Range    = "3699:3701";
char *Mixed    = "Mixed revision WC";
char *URL      = "http://project.domain.org/svn/trunk/src";

#if 1
#error Source is modified
#endif

// End of file

SubWCRev.exe从命令行或脚本中运行,使用命令行参数控制。

SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe]

WorkingCopyPath是要检查的工作副本路径,你可以只对工作副本使用SubWCRev,而不是直接对版本库,这个路径可以是绝对路径,也可以是工作目录的相对路径。

如果你想让SubWCRev执行关键字替换,象版本库版本,地址等字段保存到文本文件,就需要提供一个模版文件SrcVersionFile,输出文件DstVersionFile就是模版替换之后的版本。

有几个开关影响 SubWCRev工作。如果使用多个,必须用单个组指定,例如要用-nm,不能用-n -m

表 5.1. 列出可用的命令行开关

切换 描述
-n If this switch is given, SubWCRev will exit withERRORLEVEL 7if the working copy contains local modifications. This may be used to prevent building with uncommitted changes present.
-m If this switch is given, SubWCRev will exit withERRORLEVEL 8if the working copy contains mixed revisions. This may be used to prevent building with a partially updated working copy.
-d If this switch is given, SubWCRev will exit withERRORLEVEL 9if the destination file already exists.
-f 如果给出这个开关,SubWCRev 就会包含文件夹的最后修改版本。默认行为是取得版本号时只考虑文件。
-e If this switch is given, SubWCRev will examine directories which are included withsvn:externals, but only if they are from the same repository. The default behaviour is to ignore externals.
-x If this switch is given, SubWCRev will output the revision numbers in HEX.
-X If this switch is given, SubWCRev will output the revision numbers in HEX, with ‘0X‘ prepended.

参考这个文档http://tortoisesvn.net/docs/nightly/TortoiseSVN_zh_CN/tsvn-subwcrev.html

2,每次编译版本前执行一次获取版本号操作

以 vc6 为例, 文件的版本信息保存在 rc 文件. 编译成 res 文件, 然后和其他 obj 一起 link. 现在的思路就是. 编辑 rc 文件, 将版本号比如 2.2.4.0 改成 2.2.4.$WCREV$, 在每次 link 之前, 先用 subwcrev.exe 处理 rc 文件, 进行宏替换. 然后调用 rc.exe 编译替换后的新文件. 生成 res 之后一起 link.

. 修改 rc 文件的 versioninfo 段成如下:
#ifdef _AUTOVERSION
FILEVERSION 2,2,4,$WCREV$
PRODUCTVERSION 2,2,4,$WCREV$
#else
FILEVERSION 2,2,4,0
PRODUCTVERSION 2,2,4,0
#endif
...
#ifdef _AUTOVERSION
VALUE "FileVersion", "2, 2, 4, $WCREV$\0"
VALUE "ProductVersion", "2, 2, 4, $WCREV$\0"
#else
VALUE "FileVersion", "2, 2, 4, 0\0"
VALUE "ProductVersion", "2, 2, 4, 0\0"
#endif

其实也就是加上了条件编译. 默认情况下没有定义 _AUTOVERSION, 则使用原来的 fileversion, productversion. 如果定义了 _AUTOVERSION, 则使用新的版本信息.

. 在项目属性找到 pre-link 页. 在其中增加:
subwcrev\subwcrev.exe . myprogram.rc myprogram.rc_
rc.exe /l 0x804 /fo"\release\myprogram.res" /d "_AUTOVERSION" /d "_AFXDLL" "myprogram.rc_"

第一条命令处理 myprogram.rc , 生成 myprogram.rc_
第二条命令编译 myprogram.rc_ 为 myprogram.res, 注意它的路径. 这里是 release 版的默认路径. 原则就是这里生成的 res 替换原来的 res 文件.

按 f7, build. 现在版本信息已经刷新了. 每次向 svn 提交. 版本都会更新.

不过我们还可以更进一步. 将版本信息, 编译时间等写入到关于对话框中. 其实关键还是 pre-link.
. 创建一个文件 buildtime.cpp, 内容如下:
const char*szBuildTime = "Build on $WCNOW$";
const char*szFullVersion="MyProgram 2.2.4.$WCREV$$WCMODS?+:$$WCMIXED?#:$";

. 在关于对话框 OnInitDialog() 中加入:
extern const char* szBuildTime;
extern const char* szFullVersion;
SetDlgItemText(IDC_BUILDTIME, szBuildTime);
SetDlgItemText(IDC_VERSION, szFullVersion);

. 在 pre-link 再加上两条:
subwcrev\subwcrev.exe . buildtime.cpp buildtime_.cpp
cl /c /nologo /Fo\Release\buildtime.obj /MT buildTime_.cpp

原理和 rc 文件一样. 先替换, 后编译. 同样要保证生成的 buildtime.obj 覆盖原来的 buildtime.obj

大功告成.
不过有一点要注意. vc6 的资源编辑器在每次编辑资源之后都重新生成 rc 文件. 也就是说, 会删除我们对 rc 的修改. 还没有找到好的办法, 现在只能是每次编辑资源之后再手工添加一下条件编译的部分. 建议在项目进入 beta 之后再加上版本信息. 因为这个时候程序的资源一般都不会变动了.

另外, 虽然这里是以 vc6 为例, 但也可以应用到 vc2003, vc2005 等编译环境.

后记: 还可以考虑用程序自动修改. 找到 FILEVERSION, 将后面的版本替换成 FILEVERSION 2,2,4,$WCREV$, 然后再用 subwcrev 替换. 再用 rc 编译. 这样还不用定义 _AUTOVERSION 宏

时间: 2024-09-30 06:42:02

每次新版本build时,让软件的版本号自增的相关文章

[转]软件项目版本号的命名规则、格式介绍及管理策略

转自:http://www.flighty.cn/html/net/20121029_163.html 轻狂注:各种软件的版本号经常搞得使用者云里雾里,不知道软件的开发者到底是如果定义自己软件的版本的,所以,有必要把软件版本号命名规则方面的常识列一下. 版本控制比较普遍的 3 种命名格式 : 一.GNU 风格的版本号命名格式 : 主版本号 . 子版本号 [. 修正版本号 [. 编译版本号 ]] 英文对照 : Major_Version_Number.Minor_Version_Number[.R

maven配置tomcat插件,及在maven打包时文件名不包含版本号

maven配置tomcat插件,及在maven打包时文件名不包含版本号 <build> <!-- 指定文件名,在打包时文件名不包含版本号 --> <finalName>${project.artifactId}</finalName> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> &l

【翻译自mos文章】Oracle db 12c中,每次日志切换时,会改变alert_sid.log的权限

12c中,每次日志切换时,会改变alert_sid.log的权限 来源于: Alert log file's permissions Change with every log switch in 12c (Doc ID 1637367.1) 适用于: Oracle Database - Enterprise Edition - Version 12.1.0.1 and later Information in this document applies to any platform. 症状:

解决Docker build时 Sending build context to Docker daemon 过大的问题

当使用Dockerfile Build镜像时,优势会发现发送到Daemo的内容过大 build image:q_build/javaweb:20150910174642Sending build context to Docker daemon 4.768 GBSending build context to Docker daemon  Step 0 : FROM 192.168.100.123:5000/q_basic/javaweb:1.0  ---> 0aab72ab2945 Step 

vim设置为indent折叠以后,每次打开文件时代码处于折叠状态,能改变吗?

vim设置为indent折叠以后,每次打开文件时代码处于折叠状态.即使这次编辑的时候把折叠展开,保存关闭文件,重新打开,所有的代码都又折叠起来了. 请问有没有默认不折叠的方法? 是否有可以一次展开所有折叠的操作?(zO不行,只能移到折叠行上,展开该行以及该行下缩进更多的折叠) 2013-09-19 09:08 提问者采纳 设置上下面这个,就基本相当于默认不折叠了. set foldlevel=99 试试看zR

用MPLAB IDE编程时,软件总是弹出一个窗口提示: “the extended cpu mode configuration bit is enabled,but the program that was loaded was not built using extended cpu instructions. therefore,your code may not work properly

用MPLAB IDE编程时,软件总是弹出一个窗口提示:"the extended cpu mode configuration bit is enabled,but the program that was loaded was not built using extended cpu instructions.therefore,your code may not work properly."怎么办? 在main函数前加一句伪指令:#pragma config XINST=OFF即

Android Gradle Plugin指南(五)——Build Variants(构建变种版本号)

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 6. Build Variants(构建变种版本号) 新构建系统的一个目标就是同意为同一个应用创建不同的版本号. 这里有两个基本的使用情景: 1.同一个应用的不同版本号.比如一个免费的版本号和一个收费的专业版本号. 2.同一个应用须要打包成不同的apk以公布Google Play Store.查看http://develop

Keil4 每次选build 编译(F7)都全部编译的解决办法

Keil4 每次选build 编译(F7)都全部编译的解决办法 http://blog.csdn.net/wchengshen/article/details/50440079 Keil4 每次选build 编译(F7)都全部编译的解决办法: ocean 验证: project--option for target 'xxx' ---target---Code Generation-- 将Use Cross-Module Optimization勾选去掉 再多重新编译一次就可以了.

确保 Xcode 每次 Build 时都自己主动更新资源

參考:http://quick.cocoachina.com/?p=22 刚建立的quickproject.每次修改lua代码,都得清理一下.非常麻烦.參照着quick官网上改了改,要适配自己的项目 _TARGET_BUILD_CONTENTS_PATH=$TARGET_BUILD_DIR/$CONTENTS_FOLDER_PATH echo _TARGET_BUILD_CONTENTS_PATH: $_TARGET_BUILD_CONTENTS_PATH echo PWD: $PWD echo