使用SVN自动标注版本号

1. 起因

  前些日子为了方便的查看用户使用的版本,所以开始通过MFC资源中VERSION的更新来与SVN的版本同步,但是使用了一段时间就出现了问题,总是在commit了之后才想起来资源中VERSION忘记修改了,再加上有点小的强迫症,感觉十分不爽,想着像SVN这么普及的源码控制应该有这方面的功能,就简单的查了一下,有一些高级的东西暂时都没有看懂,就使用了一个比较简单的:subwcrev.exe。

2. 思路

  subwcrev.exe的主要功能是将文本中的一些预留的关键字用SVN中相应的信息替换。所以基本上的思路就形成了。

  1. 首先在习惯系统的资源文件:AppName.rc 中插入 subwcrev.exe 支持版本信息的关键字 $WCREV$。

  2. 由于VS支持pre-link的事件,所以在此调用subwcrev.exe进行替换,将AppName.rc中的关键字替换为版本信息。

  3. 通过rc.exe 将替换后的AppName.rc编写为程序生成目录下的AppName.res。

  通过以上三步,然后VS就会对程序进行link,所以此时的AppName.res已经是我们在编译后/连接前替换的带SVN版本号的res了,这样和其他的obj进行连接,就会生成使用SVN版本的资源了。

3. 实现

  按照思路,具体的实现也是这样的,首先就是subwcrev.exe的关键字嵌入,通过打开AppName.rc,通过查找找到VS_VERSION_INFO关键字段,并按照如下示例对文本修改。

VS_VERSION_INFO VERSIONINFO
#ifdef _AUTO_VERSION
 FILEVERSION 1,1,0,$WCREV$
 PRODUCTVERSION 1,1,0,$WCREV$
#else
 FILEVERSION 1,1,0,13600
 PRODUCTVERSION 1,1,0,13600
#endif
 FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
 FILEFLAGS 0x1L
#else
 FILEFLAGS 0x0L
#endif
 FILEOS 0x4L
 FILETYPE 0x1L
 FILESUBTYPE 0x0L
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        BLOCK "409004e4"
        BEGIN
            VALUE "Comments", ""
            VALUE "CompanyName", "Company Name"
            VALUE "FileDescription", "File Description"
            VALUE "InternalName", "AppName.exe"
            VALUE "LegalCopyright", "CopyRight 2008-2010, Company Name."
            VALUE "LegalTrademarks", ""
            VALUE "OriginalFilename", "AppName.exe"
            VALUE "ProductName", "ProductName"
            #ifdef _AUTO_VERSION
                VALUE "FileVersion", "1, 1, 0, $WCREV$"
                VALUE "ProductVersion", "1, 1, 0, $WCREV$"
            #else
                VALUE "FileVersion", "1, 1, 0, 11098"
                VALUE "ProductVersion", "1, 1, 0, 11098"
            #endif
        END
    END
    BLOCK "VarFileInfo"
    BEGIN
        VALUE "Translation", 0x4090, 1252
    END
END

  这个步骤里面需要注意的地方是引入了一个_AUTO_VERSION宏,这一点也是由于rc.exe可以定义宏的功能,加入宏的优点就是,当想使用自动的版本关联时就会生成关联,不想使用的时候我们还可以用一个默认的版本后,而不会出现类似于$WCREV$奇怪的字符。

  在修改玩AppName.rc文件后,就开始要调用subwcrev.exe和rc.exe。通过在VS中选择 Project -> Property -> Build Event -> Pre-Link event 的 command line依次添加入下的命令:

subwcrev.exe "Porject_SVN Directory" $(ProjectDir)AppName.rc $(ProjectDir)AppName.rc_
rc.exe /fo $(ProjectDir)$(IntDir)\AppName.res /d _AUTO_VERSION /d _AFXDLL AppName.rc_

  其中需要注意的地方有如下几点:

  1. "Porject_SVN Directory" 需要替换成本地的项目的SVN管理目录,这一点不知道有没有关键字之类的,暂时还没有查到,也可以使用其他的目录代替,比如$(ProjectDir)之类。

  2. $(ProjectDir) 这些形式都是VS中自带的一些宏,代表了一些相关的量。

  3. subwcrev.exe和rc.exe后面的参数用法都是有说明的,可以在命令行中运行这两个程序,都有相关的说明,很方便。

  4. AppName.rc_就是一个临时的文件,并不需要加入大版本控制中,这样做可以保证原有的AppName.rc没变化。

  5. 注意在rc.exe中定义AppName.rc中引入的宏。

  还有一个地方需要重点说明的是,如果没有将SVN加入的默认的程序目录中的话,可能会在进行Link的时候提示subwcrev.exe找不到之类的错误,那么需要在Pre-Link event 的 command line中再加入一行:

cd "subwcrev.exe Directory"
subwcrev.exe "Porject_SVN Directory" $(ProjectDir)AppName.rc $(ProjectDir)AppName.rc_ rc.exe /fo $(ProjectDir)$(IntDir)\AppName.res /d _AUTO_VERSION /d _AFXDLL AppName.rc_

  "subwcrev.exe Directory"就是指subwcrev.exe所在的目录,一般都是在SVN安装的目录下的bin目录下的。如果是协同开发的话,可以采用将subwcrev.exe添加到程序目录并加入SVN管理,并通过相对路径进行调用。
  然后编译、连接,就可以运行程序了。 

4. 总结

  最近也感觉还有非常多的东西需要学,尽量自动化也是其中的一部分了,以后更要多多的记住这个原则,简化自己的工作。

转载于:https://www.cnblogs.com/geminiv/archive/2012/11/21/2780143.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值