msbuild构建时用SVN修改版本号代替AssemblyVersion的Revision版本号

持续构建需要标识出每次构建的版本,而每次构建的时候人工去修改版本是不现实的。靠程序去添加版本号,有3种可选:1) 顺序流水号;2) 时间戳;3) SVN检出代码的修订版本号


1) 顺序流水号。需要每次构建将上次记录的流水号+1,再更新到版本中去。如果要记录每次构建的版本号,需要提交到代码器,不仅会造成代码修订版本+1,而且在构建时提交东东总是件不爽的事情。

2) 时间戳。对比流水号来说,靠谱多了,就是太长,就算以秒为单位,一天也是86400的增量

3) SVN检出代码时的修订版本号。最靠谱的还是这个,代码有更新,版本号增加,代码没更新,版本号不变。通常情况下,代码不变,构建结果基本上不需要有差异,所以选这个啦!


当然这篇博文的关键不在这里,关键是咋才能让MSBuild在构建的时候去取得版本号,并且替换掉AssemblyInfo.cs中的AssemblyVersion或AssemblyFileVersion。这要靠原生的MSBuild Task似乎是办不到,自己写Task太累。所以找了个第三方的Task:MSBuild Community Tasks。


其实这已经不是第一次接触 MSBuild Community Tasks 了,上次使用它是因为需要在项目构建时将生成的结果打包成压缩文件,所以用到了它的 Zip Task。而这次,需要用到它两个Task:


SvnVersion Task,用来获取代码的SVN修订版本号

FileUpdate,用来更新AssemblyInfo.cs文件


下面是实验环境和代码:


首先是项目目录结构(test.xml就是 MSBuild 构建脚本)

C:.
├─build
│  │  test.xml
│  │
│  └─msbuildtasks
│          MSBuild.Community.Tasks.dll
│          MSBuild.Community.Tasks.Targets
│
└─MyProject└─PropertiesAssemblyInfo.cs


构建脚本只干了一件事件,就是更新 AssemblyInfo.cs 中两个版本号的最后一位(修订版本号)。

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Test" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Import Project="msbuildtasks\MSBuild.Community.Tasks.Targets" /><PropertyGroup><MSBuildCommunityTasksLib>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</MSBuildCommunityTasksLib></PropertyGroup><Target Name="Test"><ItemGroup><AssemblyInfos Include="..\MyProject\**\AssemblyInfo.cs" /></ItemGroup><SvnVersion LocalPath="."><Output TaskParameter="Revision" PropertyName="Revision" /></SvnVersion><Message Text="Revision: $(Revision)" /><FileUpdate Files="@(AssemblyInfos)"Regex="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"ReplacementText="(&quot;${1}$(Revision)&quot;)]" /></Target>
</Project>


稍稍解释一下脚本:


    <Import Project="msbuildtasks\MSBuild.Community.Tasks.Targets" /><PropertyGroup><MSBuildCommunityTasksLib>$([MSBUILD]::Unescape(MSBuild.Community.Tasks.dll))</MSBuildCommunityTasksLib></PropertyGroup>

这里是引入 MSBuild Community Tasks 的动态库,官方写法,照抄就是了


        <ItemGroup><AssemblyInfos Include="..\MyProject\**\AssemblyInfo.cs" /></ItemGroup>

这里把所有 AssemblyInfo.cs 找出来,这样可以将一个解决方案中多个项目的版本号一起更新了。


        <SvnVersion LocalPath="."><Output TaskParameter="Revision" PropertyName="Revision" /></SvnVersion>

这里很明显就是在取当前代码的SVN修订版本号了,LocalPath指定了取哪个目录的版本号,Output则将取到的修订版本号输出到“Revision”这个属性中,关于Output,可以参考 http://msdn.microsoft.com/zh-cn/library/ms164287.aspx


需要注意的是,在 PATH 路径中可以找到 svnversion 命令。如果没有设置 PATH,可以使用 ToolPath 参数指定 svnversion 所在目录。


        <FileUpdate Files="@(AssemblyInfos)"Regex="\(&quot;(\d+\.\d+\.\d+\.)\d+&quot;\)\]"ReplacementText="(&quot;${1}$(Revision)&quot;)]" />

这部分就是通过正则表达式查找替换版本号了。有时有两点需要注意,一是在写引号的时候,需要用&quot;代替;二是在替换字符串中最好用${1}代替$1这种写法,因为后面的$(Revision)也是数字,如果不用大括号连起来就可能变成 $1123 这样,不能被正确识别,用一大括号就是 ${1}123 这样了,不会出错。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker镜像和容器常用命令

一、.Docker帮助命令 1.显示docker的版本信息 docker version 2.显示docker的系统信息&#xff0c;包括镜像和容器的数量 docker info3.docker帮助命令 docker 命令 --help二、Docker镜像命令 1.查看所有本地的主机上的镜像 docker images实例测试&#xff1a; 2.搜索镜像…

如何学会阅读源码?

作者 | youzhibing链接 | cnblogs.com/youzhibing/p/9553752.html1.读源码的经历刚参加工作那会&#xff0c;没想过去读源码&#xff0c;更没想过去改框架的源码&#xff1b;总想着别人的框架应该是完美的、万能的&#xff0c;应该不需要改&#xff1b;另外即使我改了源码&…

求模和求余

一直以为求模和求余是一回事&#xff0c;发现这两者是不同的。以下为网上转载的资料&#xff1a; 通常情况下取模运算(mod)和求余(rem)运算被混为一谈&#xff0c;因为在大多数的编程语言里&#xff0c;都用%符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下%运…

利用Dockefile将Python的py文件项目代码打包为Docker镜像

1.创建python项目 【备注&#xff1a;一定要将项目python环境依赖存至本项目下&#xff0c;默认依赖本机python环境(会造成依赖包过多)】 2.创建main.py文件&#xff0c;完成程序代码 主要功能就是获取"https://www.hao123.com/"网址页面源代码&#xff0c;并存储…

面试官:如何实现幂等性校验?

作者 | wangzaiplus来源 | https://www.jianshu.com/p/6189275403ed一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能会多次回调, 必须处理…

阿里为什么禁用Executors创建线程池?

作者 | 何甜甜在吗来源 | http://rrd.me/eUh6V看阿里巴巴开发手册并发编程这块有一条&#xff1a;线程池不允许使用Executors去创建&#xff0c;而是通过ThreadPoolExecutor的方式&#xff0c;通过源码分析禁用的原因。写在前面首先感谢大家在盖楼的间隙阅读本篇文章&#xff0…

Debian11镜像更新为阿里巴巴开源镜像站镜像,切换root用户,解决用户名不在sudoers文件中此事将被报告,Debian11 文件夹对话框、火狐浏览器、命令终端等没有最大化和最小化

选择Debian作为编程开发最佳Linux的理由&#xff1a; Debian是面向程序员的最古老&#xff0c;最出色的Linux发行版之一。Debian提供了具有.deb软件包管理兼容性的超稳定发行版。Debian为程序员提供了许多最新功能。因此&#xff0c;它具有一个特殊的编程空间。Debian是开发人员…

SCCM2012R2部署之四:配置客户端发现

前面3个章节我们简单的&#xff0c;介绍了安装配置和相关的组件。接下来我们需要给大家介绍的是如何配置客户端发现&#xff0c;让SCCM能真正管控到AD中的所有终端&#xff0c;来提供IT运维的效率。首先我们打开SCCM控制台&#xff0c;如图4-1&#xff0c;这就是我们安装完SCCM…

Debian11安装VLC Media Player视频播放器

在终端内执行下面命令&#xff1a; sudo apt install vlc

面试官:使用SpringBoot如何开发邮件发送系统?

作者 | yizhiwazi来源 | www.jianshu.com/p/5eb000544dd7SpringBoot 开发邮件发送系统还是比较方便的&#xff0c;在开始之前我们先来了解一下和发送邮件有关的基础知识。基础知识什么是SMTP&#xff1f;SMTP全称为Simple Mail Transfer Protocol&#xff08;简单邮件传输协议&…

Python计算校验文件的MD5、SHA1、SHA256和CRC32

# -*- coding: utf-8 -*- import os from hashlib import md5, sha1, sha256 from zlib import crc32strFilePath os.path.join(os.getcwd() "\\" "“捷创源科技”公众号.jpg")def getMd5(strFilePath): # 计算md5mdfive md5()with open(strFilePath,…

拼多多面试|如何用 Redis 统计独立用户访问量?

作者 | 沙茶敏碎碎念来源 | www.cnblogs.com/xiaoMzjm/p/5223799.html众所周至&#xff0c;拼多多的待遇也是高的可怕&#xff0c;在挖人方面也是不遗余力&#xff0c;对于一些工作3年的开发&#xff0c;稍微优秀一点的&#xff0c;都给到30K的Offer当然&#xff0c;拼多多加班…

Linux 指令篇:文档编辑--col

功能说明&#xff1a;过滤控制字符。语  法&#xff1a;col [-bfx][-l<缓冲区列数>]补充说明&#xff1a;在许多UNIX说明文件里&#xff0c;都有RLF控制字符。当我们运用shell特殊字符">"和">>"&#xff0c;把说明文件的内容输出成纯文本…

被一个熟悉的面试题问懵了:StringBuilder 为什么线程不安全?

作者 | 千山qianshan 来源 | juejin.im/post/5d6228046fb9a06add4e37fe前言周五去面试又被面试的一个问题问哑巴了面试官&#xff1a;StringBuilder和StringBuffer的区别在哪&#xff1f; 我&#xff1a;StringBuilder不是线程安全的&#xff0c;StringBuffer是线程安全的 面试…

Python计算校验文件的MD5、SHA1、SHA256和CRC32,获取文件创建日期、修改日期和文件大小

main.py # -*- coding: utf-8 -*- import os from hashlib import md5, sha1, sha256 from zlib import crc32 import time from math import ceilclass Hash:def __init__(self, strFilePath):self

CC++中的qsort库函数

qsort() 参考&#xff1a;http://www.slyar.com/blog/stdlib-qsort.html qsort包含在<stdlib.h>头文件中&#xff0c;此函数根据你给的比较条件进行快速排序&#xff0c;通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。 …

面试官:HTTPS 为什么是安全的?说一下他的底层实现原理?

作者 | leapmie来源 | urlify.cn/zQj6f2这篇干货不错&#xff0c;把HTTPS的原理讲清楚了&#xff0c;而且容易懂&#xff0c;建议大家好好读一下。# HTTPS随着 HTTPS 建站的成本下降&#xff0c;现在大部分的网站都已经开始用上 HTTPS 协议。大家都知道 HTTPS 比 HTTP 安全&…

PyQt5在对话框中打开外部链接的方法

利用PyQt5部分控件的Link属性链接 PyQt5有几个控件带有 setOpenExternalLinks &#xff0c; 如 QLabel、QTextLabel 、 QTextBrowser 等 当 setOpenExternalLinks 值为TURE 表示可通过html 添加 A 标签打开外部链接, 如设置&#xff1a; 我测试的是 QLabel 标签控件 self.lab…

第25周二

今天终于弄好集成测试环境&#xff0c;因为几个问题中间走了弯路&#xff0c;找到最后发现远程配置不成功是因为我没有向CMS发心跳&#xff0c;而原因是没有在spring的bean配置文件中加入心跳相关类&#xff0c;另一个问题访问没权限&#xff0c;是因为appCode类型的大小写问题…

面试官:为什么 Spring 中的 bean 默认为单例?

作者 | 小小木来源 | http://1t.click/ksQ熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。如下图是官方文档上的截图&#xff0c;感兴趣的朋友可以进去看看这五种分别有什么不同。今天要介绍的是这五种中的前两…