Azure DevOps构建含.NET Framework与.NET 5项目的解决方案失败如何解决?
问题根因
你遇到的报错核心原因是:DotNetCoreCLI@2测试任务默认调用dotnet.exe执行测试逻辑,而dotnet.exe本身不支持解析非SDK格式的.NET Framework项目,也无法访问Visual Studio专属的MSBuild targets(即日志中缺失的Microsoft.WebApplication.targets)。即使你的.NET 4.8测试项目是SDK格式,因为它依赖了非SDK格式的.NET Framework 4.8 Web API项目,依然会触发找不到targets的错误。
解决方案
将测试任务拆分为两个独立步骤,分别处理.NET 5测试项目和.NET Framework 4.8测试项目即可解决问题:
- 保留
DotNetCoreCLI@2任务,仅用于执行.NET 5测试项目,过滤掉.NET 4.8相关测试项目 - 新增
VSTest@2任务执行.NET Framework 4.8测试项目,该任务会调用Visual Studio配套的测试组件,兼容传统.NET Framework项目
修改后完整的YAML管道配置
trigger: - master pool: vmImage: 'windows-latest' variables: solution: '**/*.sln' buildConfiguration: 'Release' buildPlatform: 'Any CPU' platform: x64 steps: - task: NuGetCommand@2 displayName: 'Restore for all' inputs: restoreSolution: '$(solution)' feedsToUse: 'select' vstsFeed: '{Guid # 1}/{Guid # 2}' - task: VSBuild@1 displayName: 'Build all' inputs: solution: '$(solution)' platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' maximumCpuCount: true # 仅执行.NET 5测试项目 - task: DotNetCoreCLI@2 displayName: 'Run .NET 5 Tests' inputs: command: 'test' projects: | **/*Test.csproj !**/*Net48*Test.csproj arguments: '--configuration $(buildConfiguration) --collect "Code coverage"' framework: 'net5.0' # 单独执行.NET Framework 4.8测试项目 - task: VSTest@2 displayName: 'Run .NET Framework 4.8 Tests' inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\*Net48*Test.dll !**\*TestAdapter.dll !**\obj\** searchFolder: '$(System.DefaultWorkingDirectory)' configuration: '$(buildConfiguration)' codeCoverageEnabled: true
注意事项
如果你的.NET 4.8测试项目命名规则不包含Net48关键词,可以自行调整过滤规则,确保两类测试项目分别匹配到对应的执行任务即可。
内容的提问来源于stack exchange,提问作者DrGriff
相关产品推荐
相关产品推荐

