高级进阶:Azure DevOps搞定.NET Core编译版本号自增

点击上方蓝字关注“汪宇杰博客”

640?wx_fmt=png

熟悉.NET Framework的人知道,我们可以通过指定AssemblyVersion为10.0.*来让编译器自增版本号。但是.NET Core和.NET Standard不行。即使有MSBump这样的开源项目,也有一定的缺陷。一般这样的需求会出现在CI/CD服务器上。我们来看看如何用Azure DevOps轻松搞定。

关于.NET Core应用版本号


我曾经谐过一篇详细的.NET Core应用版本号的文章:https://edi.wang/post/2018/9/27/get-app-version-net-core有兴趣的可以先阅读一下,因为本文的内容会基于文中的知识。(域名可能被HX,微信用户可以复制到浏览器打开)我们这次要控制的,是Version字段。

640?wx_fmt=png

就是它

使用.NET Core CLI的build命令直接编译出来的DLL会显示这个版本。

640?wx_fmt=png

但其实,build命令是可以加参数的,想要在不更改csproj文件的情况下build一个自定义版本可以加个/p参数,指定Version,这样搞:

dotnet build /p:Version=10.0.8888.1234

640?wx_fmt=png

基于这个原理,我们就能控制.NET Core应用程序在编译环境的版本号。

为毛不用 MSBump

可能有朋友知道这么一个项目:MSBump,也能用来在编译时改变版本号。但是,它在编译时候会去改csproj文件,对于代码来说是一次更改。而传统.NET Fx的编译系统不会改代码。这对于我来说是无法接受的,因为引入了不可控的因素。在多人团队本地build完竟然还要签入仅仅是更改了版本号的csproj文件,不是一种好方法。并且它的默认规则,不是根据时间戳来增加版本号的,而是根据本机当前工程文件的版本。所以在多人协作的代码库里对导致版本混乱。因此我决定放弃MSBump,尽量用微软自家技术,解决自家问题。

自动生成版本号

在全自动的CI环境,我们不可能每次手工干预指定版本号。我需要一种规则和方法去生成每次都不一样,并且一眼就能判断新旧的版本号。

我个人使用的规则是:主.次.距2000年1月1日的天数.幸运数字

其中要计算的是距2000年1月1日的天数。可以用Windows计算器按出来,也可以写程序算。但在自己动手造轮子之前,一个好习惯是看看微软是否已经有现成的工具可以完成。当然,微软一定是有的:PowerShell

PowerShell计算两个日期之间相差的天数,非常简单:

$baseDate = [datetime]"01/01/2000"

$currentDate = $(Get-Date)

$interval = NEW-TIMESPAN –Start $baseDate –End $currentDate

$days = $interval.Days

640?wx_fmt=png640?wx_fmt=gif

配置 Azure DevOps

有了以上的知识。我们要做的,就是让Azure DevOps在编译时,自动计算出版本号,然后给build命令加上/p:Version参数。怎么做呢?很简单!

环境变量

首先,我们需要一个变量,比如叫做 buildNumber

在编译定义的variables里可以添加。随便指定一个版本号就行。

640?wx_fmt=png

PowerShell 任务

我们要使用PowerShell计算版本号,并给刚才那个 buildNumber 变量赋值。所以,添加一个PowerShell任务,放在最前面。

640?wx_fmt=png

给Azure DevOps编译管线里的变量赋值,有个神奇的技巧,就是用Write-Host就可以了:

##vso[task.setvariable variable=变量名称]变量值

所以最终我们的脚本是

Write-Host "Generating Build Number"

$baseDate = [datetime]"01/01/2000"

$currentDate = $(Get-Date)

$interval = NEW-TIMESPAN –Start $baseDate –End $currentDate

$days = $interval.Days

Write-Host "##vso[task.setvariable variable=buildNumber]10.0.$days.1024"

在任务属性里选择inline,复制粘贴了这段代码。 //能跑就行,实在不行,删库跑路,也挺省心。

640?wx_fmt=png

更改.NET Core任务参数

BuildPublish任务的Arguments后面都加上:

/p:Version=$(buildNumber)

注意/p的前面有个空格

640?wx_fmt=png

重跑编译,大功告成

触发一个CI/CD管线,可以看到日志中已经输出了正确的版本和参数。

640?wx_fmt=png

并且部署完后,也能得到正确的版本了:

640?wx_fmt=png

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

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

相关文章

Newbe.Claptrap - 一套以 “事件溯源” 和“Actor 模式”作为基本理论的服务端开发框架...

本文是关于 Newbe.Claptrap 项目主体内容的介绍,读者可以通过这篇文章,大体了解项目内容。轮子源于需求随着互联网应用的蓬勃发展,相关的技术理论和实现手段也在被不断创造出来。诸如 “云原生架构”、“微服务架构”、“DevOps” 等一系列关…

NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务…

Tree UVALive - 8212

Tree UVALive - 8212 题意: 有n个点,k个颜色,每个点都要被染色,相同颜色之间的边算是被该颜色覆盖,问有多少边被所有颜色覆盖 题解: 题目给的是无根树,我们可以将1默认为根然后求所有点的子…

dotnetcore-officeaddin-toolbox : Office 365 Add-in开发人员的工具箱

在上一篇文章(.NET Core开源行动:一键创建Excel Add-in) 中我给大家展示了一套为Office 365 Add-in开发人员准备的模板库,你可以通过 dotnet new excel & dotnet run 命令即可完成一个新的Add-in的创建和运行。关于如何加载这…

Asp.Net Core对接钉钉群机器人

钉钉作为企业办公越来越常用的软件,对于企业内部自研系统提供接口支持,以此来打通多平台下的数据,本次先使用最简单的钉钉群机器人完成多种形式的消息推送,参考钉钉开发文档中自定义机器人环节,此次尝试所花的时间不多…

转录组无参比对教程

写在前面 2023年将结束,小杜的生信笔记分享个人学习笔记也有2年的时间。在这2年的时间中,分享算是成为工作、学习和生活中的一部分。自己为了运行和维护社群也算花费大量的时间和精力,自己认为还算满意吧。对于个人来说,自己一直…

.NET Core开源行动:一键创建Excel Add-in

作为.NET Core开源行动的一部分,我此前已经创建和发布了一套基于.NET Core的Office 365开发模板库,是针对Microsoft Graph开发的场景的,有兴趣可以参考 https://github.com/chenxizhang/dotnetcore-office365dev-templates-msgraph &#xff…

【学习笔记】最小生成树系列的必做经典题

最小生成树系列【模板】最小生成树prim算法kruskal算法Borůvka (Sollin)算法次小生成树最小生成树计数最优比率生成树最小乘积生成树最小度限制生成树最小方差树【模板】最小生成树 prim算法 最小生成树的prim\text{prim}prim类似于最短路的dijkstra\text{dijkstra}dijkstra…

通过 Azure Pipelines 实现持续集成之docker容器化

IntroAzure DevOps Pipeline 现在对于公开的项目完全免费,这对于开源项目来讲无疑是个巨大的好消息,在 Github 的 Marketplace 里有个 Azure Pipeline,就是微软的 Azure DevOps Pipeline。实现 Docker 容器化的持续集成实现的目标&#xff1a…

Acwing 1082. 数字游戏

Acwing 1082. 数字游戏 题意: 现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。 题解: 利用数位dp的套路来做 我们还是利用前缀和来做 我们先求1~n中满足情况的个数 对于一个n位数,…

【招聘(南京)】南京纳龙科技有限公司招高级.net开发工程师

南京纳龙科技有限公司成立于2002年12月,隶属纳龙科技在南京成立的研发中心,坐落于南京市雨花台区。公司立志以守护人类心脏健康为使命,专注推动心电信息化技术的发展,为全国各级医疗机构提供心电检查、诊断一体化的解决方案。公司…

Acwing 1081. 度的数量(以及本人对数位dp的浅薄理解)

题意: 求给定区间 [X,Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。 题解: 数位DP 技巧1:[X,Y]>f(Y)-f(X-1) 技巧2:用树的方式来考虑。 在本题中,题意是问[X,Y]中…

EFCore动态切换Schema

最近做个分库分表项目,用到schema的切换感觉还是有些坑的,在此分享下。 先简要说下我们的分库分表分库分表规则我定的规则是,订单号(数字)除以16,得出的结果为这个订单所在的数据库,然后他的余数…

东莞.NET俱乐部线下技术沙龙-活动报名

自广州.NET技术俱乐部在2018年12月08日线下活动顺利开展后,东莞作为兄弟城市,也想通过线下活动的方式,点燃东莞.NET技术的熊熊之火。现决定先借助广州、深圳兄弟城市的帮助下,开展一场东莞方主办的线下活动,聚集东莞本…

如何撰写较受欢迎的技术文章

本来我这篇文章的标题是 “如何撰写受欢迎的技术文章”,但反复斟酌之下,还是加了一个“较”字,这主要是考虑我不是什么知名作者,写的文章大多也谈不上很受欢迎,贸然地谈“受欢迎” 是有点忐忑的,而改成现在…

Recursive sequence HDU - 5950

Recursive sequence HDU - 5950 题意&#xff1a; 给你一个式子&#xff1a;f[n]2f[n-2]f[n-1]n4 给你f[1]和f[2]&#xff0c;给你一个n&#xff0c;求f[n] f[1],f[2],n<231 题解&#xff1a; 很明显&#xff0c;矩阵快速幂&#xff0c;但是太久没做这种题&#xff0c;我…

使用Http-Repl工具测试ASP.NET Core 2.2中的Web Api项目

今天&#xff0c;Visual Studio中没有内置工具来测试WEB API。使用浏览器&#xff0c;只能测试http GET请求。您需要使用Postman&#xff0c;SoapUI&#xff0c;Fiddler或Swagger等第三方工具来执行WEB API的完整测试。在ASP.NET Core 2.2中&#xff0c;引入了一个名为“http-r…

Docker最全教程之使用TeamCity来完成内部CI、CD流程(十七)

本篇教程主要讲解基于容器服务搭建TeamCity服务&#xff0c;并且完成内部项目的CI流程配置。教程中也分享了一个简单的CI、CD流程&#xff0c;仅作探讨。不过由于篇幅有限&#xff0c;完整的DevOps&#xff0c;我们后续独立探讨。 为了降低容器的使用门槛以及便于大家将容器技…

自动将 NuGet 包的引用方式从 packages.config 升级为 PackageReference

在前段时间我写了一篇迁移 csproj 格式的博客 将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj&#xff0c;不过全过程是手工进行的&#xff0c;而且到最后处理 XAML 问题也非常头疼。现在&#xff0c;我们可以利用工具自动地完成这个过程。…

ASP.NET Core 自定义认证方式--请求头认证

Intro最近开始真正的实践了一些网关的东西&#xff0c;最近写几篇文章分享一下我的实践以及遇到的问题。本文主要介绍网关后面的服务如何进行认证。解决思路网关可以做一部分的认证和授权&#xff0c;服务内部有时候也会需要用户的信息&#xff0c;这时该怎么办呢&#xff0c;我…