Azure Pipelines Xamarin.Forms iOS 构建失败,出现错误 MSB4057:项目中不存在目标“_IsProjectRestoreSupported”

Azure Pipelines Xamarin.Forms iOS build fails with error MSB4057: The target "_IsProjectRestoreSupported" does not exist in the project

我们有 Xamarin.Forms 解决方案与 iOS 和 UWP 项目。我们使用 Azure 管道构建 iOS 项目。直到昨天,一切正常。 现在,构建在 NuGet 还原步骤失败并出现错误:

##[错误]nuget 命令失败,退出代码 (1) 和错误(/Users/runner/work/1/s/MyProjectName.UWP".csproj:错误 MSB4057:目标“_IsProjectRestoreSupported”不存在在项目中。

我们可以看到,在 Mac OS 构建主机上尝试为 UWP 项目恢复 NuGet 包时出现问题。 图片:macOS-11

解决方法是将其从解决方案中排除,但我们将其用于测试目的,这对我们来说不是一个好的选择。

  • 更新答案 这可以使用 MSBuild 任务来解决,如下面提到的同事。 但是,就我而言,这仍然会导致相同的错误。调查管道后。根本原因已经确定: 在 MSBuild@1 和 XamariniOS@2 任务中 你应该针对特定的 iOS 项目而不是解决方案文件,就像这样:

” - 任务:MSBuild@1 输入: 解决方案:'PathToIosProject/myproject.iOS.csproj' 配置:'$(BuildConfiguration)' msbuildArguments: /t:restore

" - 任务:XamariniOS@2 输入: 解决方案文件:PathToIosProject/myproject.iOS.csproj' 配置:'$(BuildConfiguration)' packageApp: 真 签名身份:$(APPLE_CERTIFICATE_SIGNING_IDENTITY)

  • 旧答案

我们已经设法解决了这个问题。其根本原因似乎是 MacOS 管道构建代理中对单声道框架的更新。 为了修复它,我们需要一个脚本来下载和安装旧版本的 mono 框架,作为构建管道的第一步,如下所示: link to the pipeline tasks photo

这是任务中使用的 bash 代币代码:

#!/bin/bash 设置-ex

MONO_MACOS_PKG_DOWNLOAD_URL='https://download.mono-project.com/archive/6.12.0/macos-10-universal/MonoFramework-MDK-6.12.0.100.macos10.xamarin.universal.pkg'

mkdir -p /tmp/mono-install cd /tmp/mono-install

单声道--版本

wget -q -O ./mono-installer.pkg "$MONO_MACOS_PKG_DOWNLOAD_URL"

sudo 安装程序 -pkg ./mono-installer.pkg -target /

单声道--版本

ls -alh /Library/Frameworks/Mono.framework/Versions/Current

昨天我们的 iOS (macos-11) 和 Android (macos-10.15) 管道遇到了同样的问题。

这个问题 21180 for mono seems to be the root cause, which is also referenced in a pull request to update the mono version for MacOs virtual environments. Regarding to this workflow test 我们给了 msbuild 一个机会,它成功了。

解法:

我们直接使用 MSBuild 而不是 NuGet 恢复。

- task: MSBuild@1
  inputs:
    solution: 'App.sln'
    configuration: 'Release'
    msbuildArguments: /t:restore

查看日志文件,MSBuild 忽略了 UWP 项目。这是 NuGet 对较旧的单声道版本 6.12.0.125 的行为。忽略 UWP 项目没有问题,因为它只能在 windows 环境中构建。

Project "/Users/runner/work/1/s/App.sln" on node 1 (Restore target(s)). ValidateSolutionConfiguration: Building solution configuration "Release|Any CPU". /Library/Frameworks/Mono.framework/Versions/6.12.0/lib/mono/msbuild/Current/bin/NuGet.targets(315,5): warning : Skipping restore for project '/Users/runner/work/1/s/App/App.UWP/App.UWP.csproj'. The project file may be invalid or missing targets required for restore. [/Users/runner/work/1/s/App.sln]

一些附加信息:

NuGet 还原任务使用 msbuild 查找所有引用的包。如果失败,它将使用 packages.config 文件作为回退,管道步骤不会失败。

相反,我们在 Android 和 iOS 的构建步骤中遇到错误:

error NETSDK1004: Assets file '/Users/runner/work/1/s/../obj/project.assets.json' not found. Run a NuGet package restore to generate this file.