Azure Pipelines中iOS Xamarin项目的自动版本编号



对于我的项目(基于Xamarin的移动iOS应用程序(,我已经设置了Azure Pipelines构建过程。我想为每个构建自动增加和设置ipa文件版本。

在互联网上搜索后,我发现了一篇文章,建议将以下代码添加到ios项目.csproj文件中:

<Target Name="BeforeBuild" Condition=" $(SetVersion) == true ">
<GetAssemblyIdentity AssemblyFiles="$(AssemblyPath)">
<Output TaskParameter="Assemblies" ItemName="AssemblyInfo" />
</GetAssemblyIdentity>
<PropertyGroup>
<VersionNumber>$([System.Text.RegularExpressions.Regex]::Match(%(AssemblyInfo.Version), `[^.][^.]*.[^.]*.[^.]*`))</VersionNumber>
</PropertyGroup>
<XmlPoke XmlInputPath="Resources/Info.plist" Query="//dict/key[. = 'CFBundleVersion']/following-sibling::string[1]" Value="$(BuildNumber)" />
<XmlPoke XmlInputPath="Resources/Info.plist" Query="//dict/key[. = 'CFBundleShortVersionString']/following-sibling::string[1]" Value="$(VersionNumber)" />

我手动设置版本号,由于不需要程序集版本号,我已将此简化代码添加到iosProject.csproj文件中:

<Target Name="BeforeBuild" Condition=" $(SetVersion) == true ">
<XmlPoke XmlInputPath="Info.plist" Query="//dict/key[. = 'CFBundleVersion']/following-sibling::string[1]" Value="$(BuildNumber)" />
<XmlPoke XmlInputPath="Info.plist" Query="//dict/key[. = 'CFBundleShortVersionString']/following-sibling::string[1]" Value="$(VersionNumber).$(BuildNumber)" />
</Target>

在我的azure-pipelines.yml文件中,我有以下命令行,其中包含msbuild调用的硬编码值(仅用于调试目的(:

variables:
mobileProjectMSbuildArgumentsForIOS: "/p:SetVersion=true /p:VersionNumber=1.0 /p:BuildNumber=34 /bl:$(Build.ArtifactStagingDirectory)/build_iOS.binlog"

如您所见,SetVersion为true,VersionNumber为1.0,BuildNumber为44

构建和生成二进制日志的任务如下:

- task: XamariniOS@2
inputs:
solutionFile: '**/*iOS.csproj'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'          
configuration: '$(buildConfiguration)'
msbuildArguments: "$(mobileProjectMSbuildArgumentsForIOS)"
outputDirectory: "$(outputDirectory)"
packageApp: true
args: /p:IpaPackageDir="$(outputDirectory)"
- task: PublishBuildArtifacts@1
displayName: 'Publish binary log'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'Binary log'
publishLocation: 'Container'
condition: succeededOrFailed()

但是,当项目是使用管道建造的时,建造是绿色的,但是:

  1. ipa文件的版本尚未设置为预期的1.0.34,它具有旧值,该值是在项目的.plist文件中手动设置的。

  2. 没有生成二进制日志。在运行发布二进制日志的任务时,我得到消息:

#[warning]目录"/Users/runner/work/1/a"为空。不会向构建工件"二进制日志"添加任何内容。

我的问题:

为什么XmlPoke不适用于ios.csproj文件,即使SetVersion设置为true

为什么没有生成二进制日志?

欢迎提出任何想法。

谢谢。

我发现你在XamariniOS@2任务字段msbuildArgumentsoutputDirectory是Xamarin.Android任务的字段。Xamarin.iOS任务不存在它们

因此,您可以尝试将/p:IpaPackageDir="$(outputDirectory)"outputDirectory: "$(outputDirectory)"移动到您的mobileProjectMSbuildArgumentsForIOS变量中。

variables:
mobileProjectMSbuildArgumentsForIOS: "/p:OutputPath=$(outputDirectory) /p:IpaPackageDir="$(outputDirectory)" /p:SetVersion=true /p:VersionNumber=1.0 /p:BuildNumber=34 /bl:$(Build.ArtifactStagingDirectory)/build_iOS.binlog"

然后将msbuildArguments分配给args字段:args: "$(mobileProjectMSbuildArgumentsForIOS)"

请参阅下面更改的XamariniOS@2任务:

- task: XamariniOS@2
inputs:
solutionFile: '**/*iOS.csproj'
signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
signingProvisioningProfileID: '$(APPLE_PROV_PROFILE_UUID)'          
configuration: '$(buildConfiguration)'
args: "$(mobileProjectMSbuildArgumentsForIOS)"
packageApp: true

最新更新