Azure DevOps安卓构建管道NuGet还原报错:找不到Xamarin.iOS.CSharp.targets
解决Azure DevOps Xamarin Android构建管道NuGet还原报错问题
问题重现
Azure DevOps上的Xamarin Forms Android构建管道执行NuGet还原时,出现如下错误:
找不到导入项目“C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Xamarin\iOS\Xamarin.iOS.CSharp.targets”,报错行是
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
本地构建正常,昨日管道也无异常,未修改任何.csproj或.sln文件,且同代理上的iOS管道能正常完成NuGet还原。构建代理为windows-2022,NuGet版本5.9.1。
解决方案
1. 缩小NuGet还原的项目范围
Android构建管道不需要处理iOS项目,检查NuGet还原任务的配置:
- 将
Path to solution, packages.config, or project.json字段从整个解决方案(.sln)改为仅指向Android项目的.csproj文件,或加上共享项目的.csproj,避免触发iOS项目的依赖解析。 - 如果必须使用解决方案级还原,可在任务中添加参数
-Exclude '**/*iOS*.csproj',排除所有iOS相关项目。
2. 修正MSBuild构建配置
确认Android管道的MSBuild任务参数:
- 明确指定平台和配置参数:
/p:Configuration=Release /p:Platform=Android,确保构建引擎只处理Android相关项目,不会加载iOS的targets文件。 - 打开本地解决方案的配置管理器,确认Android配置下没有勾选iOS项目的“生成”选项,重新提交修改后的
.sln到仓库。
3. 给iOS targets导入添加条件判断
如果共享项目中存在iOS的targets导入语句,可在.csproj中给导入添加条件,仅当构建iOS项目时才加载:
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" Condition="Exists('$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets') And '$(TargetPlatformIdentifier)' == 'iOS'" />
这样Android构建时会自动跳过该导入,避免找不到文件的错误。
4. 检查代理镜像的Xamarin组件(备选)
虽然iOS管道正常,但可确认windows-2022代理上的Xamarin.iOS组件是否完整:
- 在管道中添加PowerShell任务,执行
Get-ChildItem "C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Xamarin\iOS\",查看是否存在Xamarin.iOS.CSharp.targets文件。如果文件确实缺失,可手动在代理上安装Xamarin.iOS组件,但优先推荐前面的范围控制方案。
问题原因分析
大概率是以下两种情况之一:
- 构建任务配置被意外修改,导致Android管道开始处理iOS项目的依赖;
- Azure DevOps的windows-2022代理镜像最近更新,导致NuGet还原时的项目检测逻辑变化,触发了iOS项目的targets解析。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

