Xamarin iOS升级Big Sur后GitLab CI出现CompileITunesMetadata MSB4018错误
Xamarin iOS项目升级Big Sur后GitLab流水线构建失败问题
将iOS构建服务器从Mac OS Catalina升级到Big Sur后,运行cakebuild的GitLab流水线中某一特定Xamarin iOS项目构建失败,其余Xamarin iOS项目均可正常构建通过。而在另一台同样运行Big Sur系统的机器上拉取完全相同的代码(同提交、所有配置一致)时,该项目可以正常编译,甚至此前流水线构建通过的提交现在也会失败。
关键报错日志
"/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj" (Build target) (1) -> (_CompileITunesMetadata target) -> /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: The "CompileITunesMetadata" task failed unexpectedly. [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: System.ArgumentException: Path cannot be the empty string or all whitespace. [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: Parameter name: path [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at System.IO.Directory.CreateDirectory (System.String path) [0x00016] in <92218043474744ea9d64d27064c35dcb>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Xamarin.iOS.Tasks.CompileITunesMetadataTaskBase.Execute () [0x001ed] in <5fc761670f214242b2d9c8c4b0525b32>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Xamarin.iOS.Tasks.CompileITunesMetadata.Execute () [0x0002a] in <5fc761670f214242b2d9c8c4b0525b32>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute () [0x00029] in <6f1ac64b362443459ae7e79676b4c67f>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask (Microsoft.Build.BackEnd.ITaskExecutionHost taskExecutionHost, Microsoft.Build.BackEnd.Logging.TaskLoggingContext taskLoggingContext, Microsoft.Build.BackEnd.TaskHost taskHost, Microsoft.Build.BackEnd.ItemBucket bucket, Microsoft.Build.BackEnd.TaskExecutionMode howToExecuteTask) [0x002b9] in <6f1ac64b362443459ae7e79676b4c67f>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] 63 Warning(s) 1 Error(s) Time Elapsed 00:01:16.38 An error occurred when executing task 'Build'. Error: One or more errors occurred. (MSBuild: Process returned an error (exit code 1).) MSBuild: Process returned an error (exit code 1). Cleaning up file based variables 00:00 ERROR: Job failed: exit status 1
补充详细日志
Target "_CompileITunesMetadata: (TargetId:343)" in file "/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets" from project "/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj" (target "_CreateAppBundle" depends on it): Building target "_CompileITunesMetadata" completely. Output file "build-outputiTunesMetadata.plist" does not exist. Using "CompileITunesMetadata" task from assembly "/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/../iOS/Xamarin.iOS.Tasks.dll". Task "CompileITunesMetadata" (TaskId:232) Task Parameter:AppBundleDir=build-outputClubmappAppIOS.app (TaskId:232) Task Parameter:OutputPath=build-outputiTunesMetadata.plist (TaskId:232) /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: The "CompileITunesMetadata" task failed unexpectedly. [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: System.ArgumentException: Path cannot be the empty string or all whitespace. [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: Parameter name: path [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at System.IO.Directory.CreateDirectory (System.String path) [0x00016] in <92218043474744ea9d64d27064c35dcb>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Xamarin.iOS.Tasks.CompileITunesMetadataTaskBase.Execute () [0x001ed] in <5fc761670f214242b2d9c8c4b0525b32>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Xamarin.iOS.Tasks.CompileITunesMetadata.Execute () [0x0002a] in <5fc761670f214242b2d9c8c4b0525b32>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute () [0x00029] in <6f1ac64b362443459ae7e79676b4c67f>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] /Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets(320,3): error MSB4018: at Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask (Microsoft.Build.BackEnd.ITaskExecutionHost taskExecutionHost, Microsoft.Build.BackEnd.Logging.TaskLoggingContext taskLoggingContext, Microsoft.Build.BackEnd.TaskHost taskHost, Microsoft.Build.BackEnd.ItemBucket bucket, Microsoft.Build.BackEnd.TaskExecutionMode howToExecuteTask) [0x002b9] in <6f1ac64b362443459ae7e79676b4c67f>:0 [/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj] Done executing task "CompileITunesMetadata" -- FAILED. (TaskId:232) Done building target "_CompileITunesMetadata" in project "ClubmappAppIOS.csproj" -- FAILED.: (TargetId:343) Done Building Project "/Users/build/builds/Hh9r4va7/0/ClubMapp/application/ClubmappSolution/ClubmappAppIOS/ClubmappAppIOS.csproj" (Build target(s)) -- FAILED.
进一步排查结果
经查阅Xamarin iOS msbuild源码,异常抛出点如下:
Directory.CreateDirectory (Path.GetDirectoryName (OutputPath.ItemSpec));
日志显示OutputPath.ItemSpec值为build-outputiTunesMetadata.plist,该字符串仅包含文件名无路径,传入Path.GetDirectoryName()后返回空字符串,调用CreateDirectory创建空路径时触发ArgumentException:路径不能是空字符串或全空白字符。
修复方案
问题根因:构建配置的输出目录末尾缺少路径分隔符,导致输出目录名和iTunesMetadata.plist文件名直接拼接成了无路径的字符串,比如你设置的输出目录是build-output,末尾没加/,拼接后就变成了build-outputiTunesMetadata.plist而不是build-output/iTunesMetadata.plist。
可根据实际需求选择以下任意一种修复方式:
- 检查cakebuild构建脚本、项目.csproj文件或者流水线变量中配置的iOS构建输出路径(对应
OutputPath/IpaOutputPath这类参数),确保路径末尾添加了macOS系统对应的路径分隔符/ - 直接在项目.csproj文件的iOS构建配置节点下强制指定iTunesMetadata的输出路径:
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> <ITunesMetadataOutputPath>$(OutputPath)/iTunesMetadata.plist</ITunesMetadataOutputPath> </PropertyGroup>
- 如果是开发调试构建,不需要生成iTunesMetadata.plist,可直接关闭该生成任务,在.csproj中添加如下配置:
<PropertyGroup> <BuildITunesMetadata>False</BuildITunesMetadata> </PropertyGroup>
内容的提问来源于stack exchange,提问作者Frederik Hoeft
相关产品推荐
相关产品推荐

