【问题标题】:Why is msbuild.exe missing in C:\Program Files\dotnet\sdk\3.1.201? Causing AzureDevOps build step to fail为什么 C:\Program Files\dotnet\sdk\3.1.201 中缺少 msbuild.exe?导致 AzureDevOps 构建步骤失败
【发布时间】:2020-08-23 02:17:44
【问题描述】:

我有一个非常简单的 WPF 项目 (.Net 4.7.2) 和单元测试项目 (MSTest .Net Core),我正在尝试让它在 Azure Pipelines 中构建,但出现以下错误:

2020-05-07T16:41:52.9562570Z C:\Program 文件\dotnet\sdk\3.1.201\Microsoft.Common.CurrentVersion.targets(3032,5): 错误 MSB4216:无法运行“GenerateResource”任务,因为 MSBuild 无法使用运行时“CLR4”创建或连接到任务主机 和架构“x86”。请确保 (1) 请求的运行时 和/或架构在机器上可用,并且 (2) 所需的可执行文件“C:\Program Files\dotnet\sdk\3.1.201\MSBuild.exe” 存在并且可以运行。 [C:\agent_work\4\s\RsSolution4\WpfApp1\WpfApp1.csproj] 2020-05-07T16:41:53.1174401Z ##[错误]错误:进程 'C:\Program Files\dotnet\dotnet.exe' 失败,退出代码为 1

我在建议的文件夹中查找了 msbuild.exe,果然它不存在。路径存在,文件夹中有很多文件,只是没有 msbuild.exe。有一个 msbuild.dll。

这是我的 yaml 文件:

trigger:
- master

pool: 
  name: Default
  demands: msbuild

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: DotNetCoreCLI@2
  displayName: Restore NuGet
  inputs:
    command: 'custom'
    projects: '**/*.csproj'
    custom: 'restore'

- task: MSBuild@1
  inputs:
    solution: '**/*.sln'
    msbuildLocationMethod: 'location'
    msbuildLocation: 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\msbuild.exe'
    configuration: 'Release'    
    clean: true

- task: DotNetCoreCLI@2
  displayName: SSP Automated Testing
  inputs:
    command: 'test'
    projects: '**/*Test*.csproj'
    arguments: '--configuration $(buildConfiguration)'
    testRunTitle: 'SSP Testing'

【问题讨论】:

  • 嗨@Rod,您有机会尝试以下解决方法吗?进展如何?

标签: azure azure-devops


【解决方案1】:

确保添加UseDotNet 任务以确保代理上提供正确版本的 SDK:

- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '3.1.201'

我会选择使用 dotnet build 任务来构建 .NET Core 项目和 VisualStudioBuild 任务来构建 WPF 项目,这样您就不会在相同的解决方案构建中混合框架类型和 SDK。

【讨论】:

  • 但是那个位置没有 msbuild.exe 文件
【解决方案2】:

似乎this known issue 用于 dotnet 核心。上面写着On .NET Core, MSBuild doesn't support task hosts of different architectures/runtime versions

提供的解决方法是将CurrentArchitecture/CurrentRuntime 添加到PropertyGroup。看到这个similar issue

 <PropertyGroup Condition="'$(MSBuildRuntimeType)' == 'Core' Or '$(TargetFrameworkIdentifier)' != '.NETFramework'">
    <GenerateResourceMSBuildArchitecture Condition=" '$(GenerateResourceMSBuildArchitecture)' == '' ">CurrentArchitecture</GenerateResourceMSBuildArchitecture>
    <GenerateResourceMSBuildRuntime Condition=" '$(GenerateResourceMSBuildRuntime)' == '' ">CurrentRuntime</GenerateResourceMSBuildRuntime>
  </PropertyGroup> 

您还尝试仅使用 msbuild 任务来构建您的所有项目,因为 msbuild 适用于 .net 框架和 .net 核心。您可以为Msbuild tasksolution 参数指定solutionsprojects

由于您的解决方案中有 .Net 框架项目和 .Net Core 项目。我建议使用 Nuget restore task 来恢复解决方案。 Dotnet cli 不能与 .NET Framework 一起正常工作,这可能无法恢复 .net Framework 项目。

希望以上有所帮助!

【讨论】:

  • 谢谢您,您的洞察对我帮助很大。我不认为拥有 .Net Framework 和 .Net Core 不会相处得很好,所以我更新了我的项目类型以仅使用 .Net Core 匹配。
猜你喜欢
  • 2019-05-10
  • 2021-10-21
  • 2017-06-22
  • 2016-01-26
  • 1970-01-01
  • 2023-04-01
  • 2021-01-30
  • 2018-11-29
  • 1970-01-01
相关资源
最近更新 更多