Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

We have Xamarin.Forms solution with iOS and UWP projects. We use Azure pipelines to build the iOS project. Until yesterday everything was working fine. Now the build fails at the NuGet Restore step with the error:

##[error]The nuget command failed with exit code(1) and error(/Users/runner/work/1/s/"MyProjectName.UWP".csproj : error MSB4057: The target "_IsProjectRestoreSupported" does not exist in the project.

We can see that the problem occurs when trying to restore NuGet packages for the UWP project on the Mac OS build host. Image: macOS-11

Workaround will be to exclude it from the solution, but we are using it for testing purposes and this is not a good option for us.

like image 299
Iliyan Popov Avatar asked Nov 03 '21 08:11

Iliyan Popov


2 Answers

We had the same problem yesterday for our iOS (macos-11) and Android (macos-10.15) Pipelines.

The issue 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 we gave msbuild a chance, and it works.

Solution:

Instead of NuGet restore we use directly MSBuild.

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

Looking at the log file, MSBuild ignores the UWP project. That is the behavior that NuGet had with the older mono version 6.12.0.125. Ignoring the UWP-Project is no problem, because it can only be build on windows environments.

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]

Some additional information:

The NuGet restore task uses msbuild to find all referenced packages. If that fails, it will use the packages.config file as fallback, the pipeline step will not fail.

Instead we got an error in the build steps for 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.

like image 192
Simon Dallmair Avatar answered Jan 04 '23 05:01

Simon Dallmair


  • Updated Answer This can be resolved using MSBuild task instead, as the collogues mentioned below. However, in my case this still lead to the same error. After investigating the pipeline. The root cause has been identified: Both in MSBuild@1 and XamariniOS@2 tasks you should target the specific iOS Project and not the solution file, like soenter image description here:

" - task: MSBuild@1 inputs: solution: 'PathToIosProject/myproject.iOS.csproj' configuration: '$(BuildConfiguration)' msbuildArguments: /t:restore

" - task: XamariniOS@2 inputs: solutionFile: PathToIosProject/myproject.iOS.csproj' configuration: '$(BuildConfiguration)' packageApp: true signingIdentity: $(APPLE_CERTIFICATE_SIGNING_IDENTITY)

  • Old Answer

We have managed to resolve the issue. The root cause of it seems to be an update to the mono framework in the MacOS pipeline build agent. In order to fix it, we need a script for downloading and installing an older version of the mono framework as a first step of the build pipeline like so: link to the pipeline tasks photo

This is the code of the bash scrip used in the task:

#!/bin/bash set -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

mono --version

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

sudo installer -pkg ./mono-installer.pkg -target /

mono --version

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

like image 34
Iliyan Popov Avatar answered Jan 04 '23 06:01

Iliyan Popov