Azure DevOps中.NET 9 MAUI iOS构建失败,报MSB4276错误
问题背景
6个月前可正常构建的.NET 9 MAUI iOS项目,近期在Azure DevOps使用macOS-14虚拟机构建时,出现大量MSB4276错误,核心提示:
Errors: MSB4276: The default SDK resolver failed to resolve SDK "Microsoft.NET.SDK.WorkloadManifestTargetsLocator" because directory "/Users/runner/hostedtoolcache/dotnet/sdk/9.0.202/Sdks/Microsoft.NET.SDK.WorkloadManifestTargetsLocator/Sdk" did not exist.
仅修改过一处源码拼写错误,回滚到.NET 8版本后问题依旧;工作流中已完成SDK和MAUI工作负载的安装,但DotNetCoreCLI@2发布任务仍失败。
解决方案
1. 锁定.NET SDK具体版本
避免使用9.0.x这类自动拉取最新版本的配置,改用之前能正常构建的具体版本(比如9.0.100),防止新版本的SDK resolver兼容性问题:
- task: UseDotNet@2 displayName: 'Install .NET sdk' inputs: packageType: sdk version: 9.0.100 # 替换为历史成功构建的版本号 installationPath: $(Agent.ToolsDirectory)/dotnet
若使用.NET 8,可指定8.0.400这类稳定版本。
2. 清理缓存并强制重装MAUI工作负载
残留的损坏工作负载文件可能导致定位失败,清理后强制重装:
- task: CmdLine@2 displayName: 'Clean cache and reinstall MAUI Workload' inputs: script: | dotnet workload clean dotnet workload install maui --force
3. 移除虚拟机预装的.NET版本避免冲突
macOS-14镜像可能预装了其他.NET版本,和手动安装的版本产生冲突,先卸载预装版本:
- task: CmdLine@2 displayName: 'Remove pre-installed .NET' inputs: script: | sudo rm -rf /usr/local/share/dotnet sudo rm -rf /etc/dotnet
执行此步骤后再运行UseDotNet@2安装指定SDK。
4. 直接调用指定路径的dotnet执行发布
避免环境变量指向错误版本,改用安装路径的dotnet命令替代DotNetCoreCLI@2任务:
- task: CmdLine@2 displayName: 'Publish MAUI iOS App' inputs: script: | $(Agent.ToolsDirectory)/dotnet/dotnet publish AppMaui/CD.sln -f:net9.0-ios -c:Release -v:diag /p:ArchiveOnBuild=true /p:EnableAssemblyILStripping=false /p:CodesignKey="iPhone Distribution: ME (XXXXXXXXXX)" /p:CodesignProvision=a3XXX9f8-2XXX-4XXX-8XXX-deXXXX542fa2 /p:ProvisioningType=manual
原因说明
该错误多由.NET SDK版本更新后工作负载manifest定位文件缺失/损坏,或虚拟机环境中多版本.NET冲突导致SDK resolver无法正确定位组件。Azure DevOps虚拟机镜像定期更新预装软件,易引入此类兼容性问题。
内容的提问来源于stack exchange,提问作者JoeTaicoon

