当前位置: 首页 > news >正文

vs生成事件怎么根据宏定义生成不同名称_Jenkins持续部署-自动生成版本号

本文地址:https://www.cnblogs.com/Jack-Blog/p/11108136.html

作者博客:杰哥很忙

目的

本章文章主要是通过调用svn客户端命令和powershell脚本实现完全无需人工干预自动生成版本号。

详细流程

若程序需要定义版本号,则可以将版本号记录在程序集的AssemblyInfo.cs文件中

[assembly: AssemblyVersion("1.0.0")][assembly: AssemblyFileVersion("1.0.0")]

也可以在程序集右键选择属性(或者通过快捷键Alt + Enter),在Application点击Assembly Infomation...按钮修改程序集版本号和文件版本号。

3228d63fb1a04e6f224ba1ed7a107830.png

AssemblyVersion是程序集的版本,.NET的CLR用于标识出该dll的版本信息,用于定义强名称的版本号,该版本号每一位最大为16位长度,即最大为65535,超过时编译不通过。

AssemblyFileVersion是文件版本号,仅仅是文件版本号,给人看的,没有实际什么作用,也没有长度限制。

获取SVN Reversion

我们规定程序的版本号为需求版本号1.0.0加上SVN的Reversion做为修订号。这样就能直接关联上该程序集是哪个版本的代码。

关于修订号,在《TortoiseSVN》文档中有相关的说明。我看的是《TortoiseSVN 1.8.10》的文档,在第五章介绍了SubWCRev程序。通过SubWCRev程序可以执行关键字$WCREV$替换。同时我们需要提供一个版本号模板文件,通过替换版本号模板文件的关键字生成我们需要的版本号文件。

首先我们根据程序集下AssemblyInfo.cs文件复制出一个AssemblyInfo.template.cs文件。

由于我们仅仅是为了修改版本号信息,后面就称之为版本号模板文件

然后将其[assembly: AssemblyFileVersion("1.0.0.0")]修改为[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]。这样我们就可以通过SubWCRev程序替换修订号。

f7202fbcedddb8e8de601bc6392a1b3c.png

由于AssemblyVersion有大小限制,不允许超过65535,而SVN修订号很有可能会超过该值,因此CLR的程序集版本号不用改修订号。只需要修改文件版本号即可。

由于在编译时,VS会编译AssemblyInfo文件提取出程序集信息放入到程序集内。我们直接复制出来的版本号模板文件默认也会进行编译。而我们创建的版本号模板文件用于生成版本号文件,无需编译。我们需要的是通过版本号模板文件生成版本号文件,即通过AssemblyInfo.template.cs生成AssemblyInfo.cs。因此在版本号模板文件右键属性中将Build Action从Compile修改为None。

10151a8d54b19cd7fc8dd2deda9f27af.png

此时我们已经有了版本号模板文件,接下来要做的是在编译的之前先根据版本号模板文件创建我们需要的版本号文件。

VS编译的时候提供了编译前预处理功能和编译后处理功能。在程序集属性中,我们选择Build Event里面有Pre-build event command line,通过在里面输入指令可以实现在编译前执行我们想要的命令。

9c09fb6c548a6840f7b87c7d1e7a1ef5.png

同时VS内部也提供了一些宏指令供我们使用,通过点击Edit Pre-build按钮,会弹出一个编辑框

ec86319dab2eea6120187d75e822f784.png

点击Macros可以查看所有VS支持的宏指令

b0c691046c4fecc0f09cb4a7ea8666fb.png

SubWCRev程序命令格式为SubWCRev WorkingCopyPath [SrcVersionFile DstVersionFile] [-nmdfe],WorkingCopyPath为SVN的工作副本,SrcVersionFile为原始版本文件,即版本模板文件。DstVersionFile为替换关键子后保存的版本文件。

在VS环境变量中我们可以通过$(ProjectDir)获取到当前程序集路径,通过$(SolutionDir)获取到解决方案路径。

宏指令为$(指令名)格式

在预编译事件中输入以下指令SubWCRev $(SolutionDir) $(ProjectDir)PropertiesAssemblyInfo.template.cs $(ProjectDir)PropertiesAssemblyInfo.cs即可在编译前获取到SVN的reversion填充到修订号中。

编译后可以在输出窗口看到关键字替换的信息

1>------ Build started: Project: FGMain, Configuration: Debug Any CPU ------1> SubWCRev: 'F:工作SVNPlatformrunkFGMainFGMain'1> Last committed at revision 1002681> Mixed revision range 100267:1002681> Local modifications found1> Unversioned items found

获取需求号

在实际工作中,我们每次发版都会有一个需求版本号。当产生需求时整个版本都会使用这个版本号。因此我们可以在开发的时候就在开发分支上创建该版本号的需求分支。分支名称以版本号命名,这样程序就可以获取到URL的版本号信息填充到版本号模板号模板文件中。而省去了人为修改版本号的麻烦。

比如当前版本号为1.32.0,则在SVN程序的分支上创建一个1.32.0的版本。branches/FGMain/1.32.0。

接下来在我们使用SubWCRev程序关键字替换之前需要先获取到分支的版本号填充到版本号模板文件中。这样在编译前就会将版本号和SVN的修订号一同生成。

我们还需要提前判断当前SVN工作目录是否有修改,只有在工作目录有修改时,才需要更新版本号,工作目录没有修改时,则无需修改版本号。

当我们安装了SVN客户端后(同时需要选择安装命令行工具),我们可以通过SVN执行执行命令,通过SVN help查看支持的所有参数。

SVN客户端安装时需要勾选命令行工具,如下截图

31ff15c7b5ac179f19c959d45b661b8f.png

获取版本号

我们需要获取url的版本号。而版本号只有在分支目录上才有,因此我们可以通过正则解析以下url,提取版本号。若提取不到则无需执行后续逻辑

通过svn info获取当前目录的svn信息,通过svn info 路径获取指定路径的svn信息。

F:工作SVNPlatformrunkFGMain>svn infoPath: .Working Copy Root Path: F:工作SVNPlatformrunkFGMainURL: http://inner.svn.com:81/ATS_Code/Platform/branches/FGMain/1.32.0Relative URL: ^/Platform/branches/FGMain/1.32.0Repository Root: http://inner.svn.com:81/ATS_CodeRepository UUID: 2fd9d0ce-2897-f849-b9e2-af1303b08de7Revision: 99512Node Kind: directorySchedule: normalLast Changed Author: wishLast Changed Rev: 99512Last Changed Date: 2019-06-14 17:54:47 +0800 (周五, 14 6月 2019)

命令会返回多行信息,我使用的时SVN 1.11 版本的客户端,其他版本可能会有不同。我们解析第二行的URL从而解析出URL的版本号。

$svnInfo = svn info $projectDir$urlInfo = $svnInfo[2]$url = $urlInfo.Replace("URL: 

相关文章:

  • 绝对妙算 身在职场必做的10件事
  • python设置文件权限_python通用权限框架
  • wince车机刷系统_城会玩!一顿折腾给奥迪Q5车机加装AV视频输入成功玩上坦克大战...
  • 2007,走好长征路!
  • c++开发工程师是属于前端还是后端_编程第一课 了解软件开发过程和程序员的工作...
  • 专业手机游戏开发基础(1)
  • tcp只发送不接收会怎样_面试TCP协议灵魂拷问十二个(建议收藏)
  • 专业手机游戏开发基础(2)
  • c++ string类的常用方法_String类型及其常用方法(2)
  • anaconda rstudio安装后打不开_spyder打不开 安装anaconda 的tips
  • 任正非:实事求是的科研方向与二十年的艰苦努力(新年推荐)
  • 为什么使用依赖注入_一起来踩踩 Spring 中这个循环依赖的坑
  • 一个由CVS不区分大小导致的404问题
  • springboot profile_SpringBoot-基础
  • 设置列表框最小宽度且可随着内容变宽的方法
  • JS 中的深拷贝与浅拷贝
  • 《Java编程思想》读书笔记-对象导论
  • codis proxy处理流程
  • eclipse(luna)创建web工程
  • Elasticsearch 参考指南(升级前重新索引)
  • ES6 学习笔记(一)let,const和解构赋值
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • js正则,这点儿就够用了
  • laravel 用artisan创建自己的模板
  • React-生命周期杂记
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SQLServer之创建显式事务
  • Vue2 SSR 的优化之旅
  • vue-loader 源码解析系列之 selector
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 事件委托的小应用
  • 探索 JS 中的模块化
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 最简单的无缝轮播
  • Spring Batch JSON 支持
  • ![CDATA[ ]] 是什么东东
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (三) diretfbrc详解
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (一) storm的集群安装与配置
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)关于pipe()的详细解析
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • []error LNK2001: unresolved external symbol _m
  • [100天算法】-二叉树剪枝(day 48)
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [28期] lamp兄弟连28期学员手册,请大家务必看一下
  • [BZOJ3757] 苹果树
  • [C#]科学计数法(scientific notation)显示为正常数字
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh