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 pipelinesRelease PipelinesTask groups

4. 最后

任务组是一个很好用的功能,可惜在 YAML 管道中不能使用。有关任务组的更多内容可以参考官方文档:

Azure Pipelines 和 TFS 中的任务组

最新文章

  1. yii2搭建完美后台并实现rbac权限控制实例教程
  2. 组合模式及C++实现
  3. Objective-C:Foundation框架-常用类-NSMutableDictionary
  4. NYOJ-655 光棍的YY AC 分类: NYOJ 2013-12-29 19:24 224人阅读 评论(0) 收藏
  5. 济南学习 Day 3 T3 pm
  6. Castle IOC FOR MVC 使用方法
  7. inline-block间隙原因和解决方法(web前端问题)
  8. 翻译-让ng的$http服务与jQuerr.ajax()一样易用
  9. c#中如何跨线程调用windows窗体控件
  10. 教你如何实现微信小程序与.net core应用服务端的无状态身份验证
  11. 主机管理+堡垒机系统开发:strace命令用法详解(六)
  12. 2.9 while循环
  13. Docker学习笔记1 -- 刚入手docker时的几个命令
  14. GET请求Referer限制绕过总结
  15. Xcode6:模拟器消失了?
  16. 基于alpine用dockerfile创建的tomcat镜像
  17. Python之类属性的增删改查
  18. ntohs, ntohl, htons,htonl的比较和详解【转】
  19. MongoDB(六):使用C#代码连接并读取MongoDB数据库
  20. [SHELL]查看端口,文件,服务关系的四个命令netstat,lsof,fuser,nmap

热门文章

  1. Java对象内存分布
  2. 附近的人?你zao吗?
  3. 数据流分析软件SQLFlow的高阶模式Job任务介绍
  4. 【Web前端HTML5&CSS3】08-盒模型补充
  5. [bug] TypeError : unsupported operand type(s) for += : 'NoneType' and 'int'
  6. 【转载】kvm迁移
  7. Linux ll查看文件属性详解-软硬链接详解
  8. etc/sudoers配置文件详解-(转自xoker)
  9. python3 摆放家具练习
  10. jq slideDown后里面的A链接失效(已解决)