[英]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.