DevOps流水线间歇性出现CVT1108:无法打开RES临时文件写入错误
问题现象
使用Visual Studio 2019构建C#应用的拉取请求CI流水线时,会随机抛出以下错误(每次报错的临时文件名RESxxxx.tmp均不同):
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\al.exe /culture:da /out:obj\Release\da\MyApp.resources.dll /platform:AnyCPU /template:obj\Release\MyApp.exe /embed:obj\Release\MyApp.Properties.Resources.da.resources
##[error]CVTRES(0,0): Error CVT1108: cannot open C:\Users\WP2BUI~1\AppData\Local\Temp\RES161C.tmp for writing
伴随后续连锁错误:
CVTRES : fatal error CVT1108: cannot open C:\Users\WP2BUI~1\AppData\Local\Temp\RES161C.tmp for writing [c:\agent_work\56\s\src\MyApp\MyApp.csproj]
##[error]ALINK(0,0): Error AL1019: Metadata failure while creating assembly -- The specified image file did not contain a resource section.
已知情况
- 流水线为多开发者共用的拉取请求处理流水线
- 本地构建时
RES....tmp文件会被自动清理,但构建服务器临时目录积累了数百个留存数月的0字节临时文件 - 错误始终由
al.exe处理多语言资源时触发,失败的语言随机 - 已排除权限问题(构建代理用户具备临时目录写入权限,且问题并非每次构建都出现)
解决方向
1. 清理构建代理临时目录
服务器积累的大量旧临时文件可能引发文件名冲突或资源占用,建议在流水线构建启动前添加清理步骤:
# 仅清理RES开头的临时文件 Remove-Item -Path "C:\Users\WP2BUI~1\AppData\Local\Temp\RES*.tmp" -Force -ErrorAction SilentlyContinue # 或清理7天前的所有临时文件(按需调整天数) Get-ChildItem -Path "C:\Users\WP2BUI~1\AppData\Local\Temp\" -Recurse -File | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item -Force
2. 指定专属临时目录
通过修改TMP/TEMP环境变量,让al.exe使用构建工作区下的专属临时目录,避免与其他进程争抢系统临时文件资源:
$customTemp = "C:\agent_work\tmp\MyAppBuildTemp" New-Item -Path $customTemp -ItemType Directory -Force $env:TMP = $customTemp $env:TEMP = $customTemp
3. 禁用并行构建
多语言资源处理时的并行构建可能导致al.exe进程冲突,尝试在MSBuild命令中禁用并行:
msbuild /m:1 /p:BuildInParallel=false
4. 更新构建工具
Visual Studio 2019旧版本的Build Tools可能存在al.exe资源处理bug,建议升级到VS 2019 Build Tools的最新补丁版本,或更新.NET Framework 4.8 SDK至最新版。
5. 校验资源文件完整性
偶尔损坏的资源文件也可能触发该问题,可在流水线中添加校验步骤,检查.resx或.resources文件的大小是否正常,过滤空文件进入构建流程。
内容的提问来源于stack exchange,提问作者komodosp

