1. 使用 PowerShell 腳本
在上一篇文章中我們學會了怎么使用擴展在編譯前實時更改版本號。有些情況下我們希望不適用擴展,例如喜歡發明輪子,或者根本沒有安裝擴展的權限。這時候我們可以自己寫 PowerShell 解決這個問題。
在 Pipeline 中添加一個 PowerShell 的任務,Type 選擇 Inline,然后在 Script 里輸入這段 PowerShell 腳本:
$ComponentPath = $Env:Build_SourcesDirectory
$VersionNumber = $Env:AssemblyVersion+"."+$Env:Build_BuildId+".0"
$ErrorActionPreference = "Stop"
Write-Output "ComponentPath""$ComponentPath""."
Write-Output "VersionNumber""$VersionNumber""."
$assemblyFiles = Get-ChildItem -Recurse -Path $ComponentPath -Include AssemblyInfo.cs | Where-Object { $_.fullname -notmatch "\\packages\\" }
$assemblyVersionRegex = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyVersion\("[^"]*"\)\]',MultiLine
$assemblyFileVersionRegex = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyFileVersion\("[^"]*"\)\]',MultiLine
$assemblyInfoVersionRegex = New-Object System.Text.RegularExpressions.Regex -ArgumentList '^\s*\[assembly:\s*AssemblyInformationalVersion\("[^"]*"\)\]',Multiline
foreach ($file in $assemblyFiles)
{
$content = [System.IO.File]::ReadAllText($file)
$assemblyVersionReplacement = [string]::Format("[assembly: AssemblyVersion(""{0}"")]", $VersionNumber)
$assemblyFileVersionReplacement = [string]::Format("[assembly: AssemblyFileVersion(""{0}"")]", $VersionNumber)
$assemblyInfoVersionReplacement = [string]::Format("[assembly: AssemblyInformationalVersion(""{0}"")]", $VersionNumber)
$content = $assemblyVersionRegex.Replace($content, $assemblyVersionReplacement)
$content = $assemblyFileVersionRegex.Replace($content, $assemblyFileVersionReplacement)
$content = $assemblyInfoVersionRegex.Replace($content, $assemblyInfoVersionReplacement)
[System.IO.File]::WriteAllText($file, $content)
Write-Output "Updated file ""$file"" to have version ""$VersionNumber""."
}
上面這段 PowerShell 的作用是修改項目里的 AssemblyInfo.cs
,將版本號改為 $Env:AssemblyVersion+"."+$Env:Build_BuildId+".0"
。有了這個 Task,我們可以不再依賴擴展來實現這個功能。
需要注意的是,在 PowerShell 里使用 Azure Pipelines 的變量的格式是 $Env:
+ 變量名,變量名里的句號 .
要改為下划線 _
,例如 $(Build.BuildId)
在 PowerShell 里的引用方式為 $Env:Build_SourcesDirectory
。
2. 使用任務組
下一步,為了不在每個 Pipeline 中復制粘貼這個 Task 及其中的 PowerShell 腳本,我們需要把這個 Task 做成一個公共的東西。這時候可以使用任務組 ,它可以將已在生成或發布管道中定義的一系列任務封裝到可添加到生成或發布管道中的單個可重用任務,就像任何其他任務一樣。不過需要注意的是 YAML 管道不支持任務組,任務組只能用在經典管道中。
創建任務組的方式如下圖所示,在任務列表中選中一個或多個任務,然后在右鍵菜單中選中 Create task group,在彈出的對話框中輸入名稱,選擇分類,最后點擊 Create 完成創建。
創建任務組后,之前選中的任務就原地轉換為新的任務組。
這個任務組的使用方式其它任務一樣,在 Add tasks 里添加到 Pipeline 即可。
3. 管理任務組
在左邊的菜單中選中 Task groups 進入任務組列表的頁面,在列表中選中要管理的任務組進入任務組的詳細頁面。
在 Task 頁中可以像在 Pipeline 中管理任務一樣管理任務組的任務,也可以修改任務組的名稱、分類、版本號等信息。
在 History 頁中可以查看更改的歷史記錄。
在 References 頁中可以看到任務組被引用的 Build pipelines、Release Pipelines、Task groups。
4. 最后
任務組是一個很好用的功能,可惜在 YAML 管道中不能使用。有關任務組的更多內容可以參考官方文檔: