高级进阶:Azure DevOps搞定.NET Core编译版本号自增
點擊上方藍字關注“汪宇杰博客”
熟悉.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字段。
就是它
使用.NET Core CLI的build命令直接編譯出來的DLL會顯示這個版本。
但其實,build命令是可以加參數的,想要在不更改csproj文件的情況下build一個自定義版本可以加個/p參數,指定Version,這樣搞:
dotnet build /p:Version=10.0.8888.1234
基于這個原理,我們就能控制.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
配置 Azure DevOps
有了以上的知識。我們要做的,就是讓Azure DevOps在編譯時,自動計算出版本號,然后給build命令加上/p:Version參數。怎么做呢?很簡單!
環境變量
首先,我們需要一個變量,比如叫做 buildNumber
在編譯定義的variables里可以添加。隨便指定一個版本號就行。
PowerShell 任務
我們要使用PowerShell計算版本號,并給剛才那個 buildNumber 變量賦值。所以,添加一個PowerShell任務,放在最前面。
給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,復制粘貼了這段代碼。 //能跑就行,實在不行,刪庫跑路,也挺省心。
更改.NET Core任務參數
在Build及Publish任務的Arguments后面都加上:
/p:Version=$(buildNumber)
注意/p的前面有個空格
重跑編譯,大功告成
觸發一個CI/CD管線,可以看到日志中已經輸出了正確的版本和參數。
并且部署完后,也能得到正確的版本了:
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的高级进阶:Azure DevOps搞定.NET Core编译版本号自增的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长沙.NET社区之光
- 下一篇: asp.net ajax控件工具集 Au