簡體   English   中英

Xamarin.Forms項目無法在Azure Pipelines中生成

[英]Xamarin.Forms project fails to build in Azure Pipelines

我有一個適用於Android的Xamarin.Forms項目,可以在本地構建/測試/部署/打包程序而不會出現任何錯誤,並且該應用程序可以在手機上正常運行。 完善!

現在,我想開始使用Azure DevOps Pipelines for CI,使用向導創建Xamarin Pipeline,啟動Pipeline,它失敗並出現編譯錯誤:

  /Users/vsts/agent/2.155.1/work/1/s/MyProject/MyService.cs(41,64): error CS1503: Argument 1: cannot convert from 'char' to 'string' [/Users/vsts/agent/2.155.1/work/1/s/MyProject/MyProject.Android.csproj]

為什么要在本地構建而不在管道中構建? 錯誤消息中引用的代碼是以下功能:

var x = string.Join(',', nextStations);  // nextStations is IEnumerable<string>

我發現string.Join(char, IEnumerable<T>)函數僅在.NET Core Framework中可用,而在其他版本(如Xamarin.Android 7.1的.NET)中不可用 -只有string.Join(string, IEnumerable<T>)函數。

當然,我現在可以將所有代碼更改為不使用僅.net Core中可用的那些函數。 實際上,我嘗試過此操作,但是隨后Azure Build失敗了,因為我引用的NuGet程序包之一也使用了此類.Net Core-only字符串函數,因此在管道中鏈接應用程序失敗。 因此,這不是解決方案。

因此,無論出於何種原因,Azure管道似乎都嘗試根據其他框架構建我的項目。 為什么? 有沒有一種配置方式? 還是Azure DevOps中的錯誤? 即使當我從“管道”日志中獲取msbuild命令並針對我的項目在本地執行該命令時,該命令也不會出現任何錯誤。 那么為什么不准備推出呢?

msbuild /Users/vsts/agent/2.155.1/work/1/s/MyProject/MyProject.Android.csproj /t:PackageForAndroid /p:OutputPath=/Users/vsts/agent/2.155.1/work/1/b/Release /p:Configuration=Release

我猜這與這里的問題相同: 如何修復Azure Pipelines中的“錯誤處理方法:'System.Void Prism.Navigation.PageNavigationService”錯誤,但該問題沒有真正的答案(切換到Debug不會在這里解決),我發現了更多細節,即不同的Framework版本。

那么有什么想法如何使Pipeline構建項目嗎?

Visual Studio 2019,Xamarin.Forms 4.2.0.778463,Android目標框架v9.0

我的azure-pipelines.yml文件供參考:

trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  buildConfiguration: 'Release'
  outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'

- task: XamarinAndroid@1
  inputs:
    projectFile: '**/*droid*.csproj'
    outputDirectory: '$(outputDirectory)'
    configuration: '$(buildConfiguration)'

我不確定為什么要在您的本地計算機上構建它,但是如果我不得不猜測這可能是因為您有一些此版本的代碼的緩存版本在某些時候運行良好。

但是,如果您查看string.Join()方法(對於NETStandard)的文檔 ,您將看到沒有將char作為第一個參數的重載。 他們全都帶string 因此,您需要使用雙引號"<your_string_separator>"而不是單引號'<your_char_separator>'

我相信您的錯誤線路應如下所示

var x = string.Join(",", nextStations); // Notice that double quotes "", instead of single ones ``

編輯 :抱歉,我沒有閱讀您的整個問題,我只是意識到您實際上是在提到您已經檢查了.NET Core的string.Join() 但是,這是令人困惑的部分,您可能尚未意識到這一點,.NET Core與Mono的兼容性部分(Xamarin框架)是通過NETStandard完成的(請參閱docs

兼容:.NET Core通過.NET Standard與.NET Framework,Xamarin和Mono兼容。

EDIT2 :更多鏈接

簡而言之,Mono兼容性-> https://www.mono-project.com/docs/about-mono/compatibility/

關於Mono和.NET Core之間差異的深入介紹-> https://stackoverflow.com/a/39740592/510627

一周前我遇到了同樣的問題,我發現了這個問題 仔細檢查我的管道日志,我發現托管的MacOS使用的是Mono版本5.12,因此我在XamarinAndroid任務之前添加了一個步驟,在其中設置了新版本,這是我的azure-pipelines.yaml文件:

trigger:
- master

pool:
  vmImage: 'macos-latest'

variables:
  buildConfiguration: 'Release'
  outputDirectory: '$(build.binariesDirectory)/$(buildConfiguration)'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '**/*.sln'
- task: Bash@3
  inputs:
    targetType: 'inline'
    script: |
      echo 'Selecting Mono version...'
      sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh 5_18_1
- task: XamarinAndroid@1
  inputs:
    projectFile: '**/*Droid*.csproj'
    outputDirectory: '$(outputDirectory)'
    configuration: '$(buildConfiguration)'
- task: CopyFiles@2
  inputs:
    SourceFolder: '$(build.binariesDirectory)/$(buildConfiguration)'
    Contents: '*.apk'
    TargetFolder: '$(build.artifactstagingdirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

您可以在此處找到更多信息以及此處的工具版本

問候!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM