You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps发布至App Center后所有版本均显示为1.0(1)问题

.NET Maui Android应用Azure DevOps CI/CD版本不一致问题

问题现象

用.NET Maui开发的Android应用,在Azure DevOps上配置了CI/CD流水线。CD执行成功后,App Center里显示的所有版本都是同一个,和CI流水线设置的版本对不上。用来更新版本信息的Bash脚本执行时提示AndroidManifest.xml文件不存在,但AssemblyInfo.cs的版本号已经更新成功。

原脚本内容

ANDROID_MANIFEST_FILE="AndroidManifest.xml"

if [[ ${{ parameters.SetVersionCodeInManifest }} == True ]]
then
  VERSION_CODE="$(Azure_DevOps_BUILD_ID)"

  echo "Updating Android build information. New version code $VERSION_CODE"

  sed -i '' -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE
fi

VERSION_NAME=$(App_BUILD_NUMBER)

echo "Updating Android build information. New version name $VERSION_NAME"

sed -i '' -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE

cat $ANDROID_MANIFEST_FILE

# Set AssemblyInfo
assemblyInfoPath='assemblyinfo.cs'
echo "assemblyInfoPath: $assemblyInfoPath"
sed -i '' -e 's/"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"/"'$(App_BUILD_NUMBER)'"/' "$assemblyInfoPath"
cat $assemblyInfoPath

脚本执行结果

Updating Android build information. New version code 72719
sed: can't read : No such file or directory
sed: can't read /Platforms/Android/AndroidManifest.xml: No such file or directory
Updating Android build information. New version name 1.0.0.7184
sed: can't read : No such file or directory
sed: can't read /Platforms/Android/AndroidManifest.xml: No such file or directory
cat: /Platforms/Android/AndroidManifest.xml: No such file or directory
assemblyInfoPath: Properties/assemblyinfo.cs
sed: can't read : No such file or directory
//------------------------------------------------------------------------------

using System;
using System.Reflection;

[assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.PackageName", "3486d78e-ccd6-4b01-8805-f784dfd27193")]
[assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.PublisherName", "User Name")]
[assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.Name", "My.App")]
[assembly: System.Reflection.AssemblyMetadataAttribute("Microsoft.Maui.ApplicationModel.AppInfo.Version", "1.0.0.7184")]
[assembly: System.Reflection.AssemblyCompanyAttribute("My.App")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.7184")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0+99823c39b76e2e934d222f88f256c57b37f1c3a0")]
[assembly: System.Reflection.AssemblyProductAttribute("My.App")]
[assembly: System.Reflection.AssemblyTitleAttribute("My.App")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.7184")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows10.0.22000.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows10.0.17763.0")]

// Generated by the MSBuild WriteCodeFragment class.

错误原因分析

  1. 文件路径错误:脚本里ANDROID_MANIFEST_FILE只写了文件名,没指定完整相对路径。.NET Maui项目中AndroidManifest.xml的实际路径是Platforms/Android/AndroidManifest.xml,流水线工作目录下找不到该文件。
  2. Sed命令参数不兼容:sed -i ''是macOS系统的写法,但Azure DevOps默认用Ubuntu代理,Linux环境下sed -i不需要空引号,空引号会被当成无效文件路径,导致sed: can't read : No such file or directory错误。
  3. 变量引用错误:脚本里Azure_DevOps_BUILD_ID和App_BUILD_NUMBER的引用方式不对,Azure DevOps流水线变量应该用$(Build.BuildId)(内置构建ID变量)和$(App_BUILD_NUMBER)(自定义变量)的格式。

修复方案

1. 修正文件路径

把ANDROID_MANIFEST_FILE设置为完整相对路径:

ANDROID_MANIFEST_FILE="Platforms/Android/AndroidManifest.xml"

2. 适配Linux环境的Sed命令

移除sed -i后面的空引号,改成Linux兼容的写法:

# 修改versionCode的sed命令
sed -i -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE
# 修改versionName的sed命令
sed -i -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE

3. 修正变量引用方式

使用Azure DevOps正确的变量格式:

VERSION_CODE="$(Build.BuildId)"
VERSION_NAME="$(App_BUILD_NUMBER)"

4. 可选:添加文件存在检查

在操作文件前先检查文件是否存在,避免报错中断流水线:

if [[ ! -f $ANDROID_MANIFEST_FILE ]]; then
  echo "Error: $ANDROID_MANIFEST_FILE not found in current directory!"
  exit 1
fi

完整修复后的脚本

ANDROID_MANIFEST_FILE="Platforms/Android/AndroidManifest.xml"

# 检查文件是否存在
if [[ ! -f $ANDROID_MANIFEST_FILE ]]; then
  echo "Error: $ANDROID_MANIFEST_FILE not found!"
  exit 1
fi

if [[ ${{ parameters.SetVersionCodeInManifest }} == True ]]
then
  VERSION_CODE="$(Build.BuildId)"

  echo "Updating Android build information. New version code $VERSION_CODE"

  sed -i -e 's/versionCode="1"/versionCode="'$VERSION_CODE'"/' $ANDROID_MANIFEST_FILE
fi

VERSION_NAME="$(App_BUILD_NUMBER)"

echo "Updating Android build information. New version name $VERSION_NAME"

sed -i -e 's/versionName="[0-9.]*"/versionName="'$VERSION_NAME'"/' $ANDROID_MANIFEST_FILE

cat $ANDROID_MANIFEST_FILE

# Set AssemblyInfo
assemblyInfoPath='Properties/assemblyinfo.cs'
echo "assemblyInfoPath: $assemblyInfoPath"
# 同样适配sed参数
sed -i -e 's/"[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*"/"'$(App_BUILD_NUMBER)'"/' "$assemblyInfoPath"
cat $assemblyInfoPath

内容的提问来源于stack exchange,提问作者Mina Maras

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 22:28:13