Azure DevOps管道构建多版本.NET框架解决方案配置问题
问题描述
- 原有Azure Pipeline运行在
windows-2019代理池,可正常构建面向.NET Standard 2.1、.NET Framework 4.7.2、.NET 5、.NET Core 3.1的所有项目与解决方案。 - 新增面向.NET 6的优先构建项目后,因
windows-2019镜像未预装.NET 6 SDK,通过UseDotNet@2任务安装.NET 6 SDK完成新项目构建后,其余原有项目全部构建失败。 - 尝试通过
UseDotNet@2任务切换回旧版.NET SDK时出现冲突:Solution 3同时包含面向.NET 5和.NET Core 3.1的项目,单独指定.NET 5版本时会缺失.NET Core 3.1导致构建失败,单独指定.NET Core 3.1版本时又会缺失.NET 5导致构建失败。
当前使用的管道YAML配置如下:
pool: vmImage: 'windows-2019' - task: UseDotNet@2 displayName: 'Use .NET 6 sdk' inputs: version: 6.0.x includePreviewVersions: true #Project Uses only .Net 6 - task: DotNetCoreCLI@2 displayName: 'Build ProjectUsingNet6' inputs: command: 'build' projects: '**\ProjectUsingNet6.sln' #Solution uses only .NET 3.1 - task: UseDotNet@2 displayName: 'Use .Net Core 3.1' inputs: version: '3.1.x' - task: VSBuild@1 displayName: ProjectUsingNet31 inputs: solution: '**\SolutionTargetingNet31.sln' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' #Projects in solution tagerting .NET Standard 2.1, .NET 4.7.2, .NET 5, .Net Core 3.1 which fails - task: VSBuild@1 displayName: Solution 3 inputs: solution: '**\Solution3.sln' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)'
解决方案
Azure Pipeline完全支持在构建前同时配置多个可用的.NET SDK版本,不需要为不同项目反复切换单版本SDK。
问题根因
UseDotNet@2任务每次执行时,默认会将指定版本设置为全局默认的dotnet版本,未被执行安装的SDK版本不会出现在全局可用SDK列表中。当前配置在构建Solution 3前仅安装了.NET Core 3.1,从未安装.NET 5 SDK,构建多目标项目时自然会报对应版本缺失的错误。
正确配置方法
在管道执行所有构建任务前,通过UseDotNet@2任务把所有需要用到的.NET SDK版本全部安装完成即可。多个版本的SDK会被自动注册到全局可用列表,构建时dotnet/VSBuild会自动根据项目文件中声明的<TargetFramework>匹配对应版本的SDK完成编译,不需要手动切换默认版本。
针对当前场景,需要提前安装的SDK版本为:.NET 6.0.x、.NET Core 3.1.x、.NET 5.0.x。.NET Framework 4.7.2为windows-2019代理镜像预装组件,不需要额外安装。
修正后的YAML配置参考:
pool: vmImage: 'windows-2019' # 提前安装所有需要的.NET SDK版本,无需后续反复切换 - task: UseDotNet@2 displayName: 'Install .NET 6 SDK' inputs: version: 6.0.x includePreviewVersions: true - task: UseDotNet@2 displayName: 'Install .NET 5 SDK' inputs: version: 5.0.x - task: UseDotNet@2 displayName: 'Install .NET Core 3.1 SDK' inputs: version: 3.1.x # 构建.NET 6项目 - task: DotNetCoreCLI@2 displayName: 'Build ProjectUsingNet6' inputs: command: 'build' projects: '**\ProjectUsingNet6.sln' # 构建.NET Core 3.1专属解决方案 - task: VSBuild@1 displayName: Build SolutionTargetingNet31 inputs: solution: '**\SolutionTargetingNet31.sln' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' # 构建多目标框架的Solution3,所有需要的SDK均已提前安装,可正常编译 - task: VSBuild@1 displayName: Build Solution 3 inputs: solution: '**\Solution3.sln' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)'
可选优化
如果安装多版本SDK后出现版本自动匹配不符合预期的问题,可以在仓库根目录添加global.json文件,明确声明允许使用的SDK版本范围,避免SDK前滚规则匹配到错误版本。
内容的提问来源于stack exchange,提问作者Jakub Vojtašák
相关产品推荐
相关产品推荐

