.NET 9 ClickOnce 发布为何会改错 deps.json 文件名?
结论
这段日志可以确认,_CopyFilesToPublishFolder 将源文件 app.publishMyApp.deps.json 原样复制到了 ClickOnce 应用程序文件目录。前一个复制步骤把目标路径写成了 MyApp.deps.json,但这不能说明源文件已经改名,也不能据此认定第二步导致了错误文件名。
仅凭日志无法判断 app.publish(或 MyAppPublish)前缀最初是由哪个任务或项目项元数据引入的。要确定原因,需要追踪源文件的生成过程和发布项的传递过程,不能只根据这两条复制记录归因于某个 MSBuild 属性。
从日志能看出什么
关键记录是:
Copying file from "D:\a\1\b\MyApp\app.publishMyApp.deps.json" to "D:\a\1\b\MyApp\app.publish\Application Files\MyApp_2026_309_1647_45076\app.publishMyApp.deps.json".
源路径中的文件名已经是 app.publishMyApp.deps.json。目标目录中的文件名也相同,因此这一步是按源文件名复制的。另一个步骤将文件复制到 ...\app.publish\MyApp.deps.json,说明这次复制指定了不同的目标文件名;但这不能证明源文件在磁盘上已经改名。
定位文件名在哪一步改变
先保存完整的 MSBuild 二进制日志:
msbuild MyApp.csproj /t:Publish /p:PublishDir="C:\temp\MyAppPublish" /p:PublishProtocol=ClickOnce /p:MapFileExtensions=false /p:GenerateManifests=true /bl:publish.binlog
在 MSBuild Structured Log Viewer 中搜索 MyApp.deps.json 和 app.publishMyApp.deps.json,并沿日志向前检查:
- 哪个任务首次生成或复制了
app.publishMyApp.deps.json。 - 文件进入 ClickOnce 发布项集合时,
Identity、TargetPath、Link、RelativeDir等元数据分别是什么。 PublishDir的末级目录是否在路径拼接或元数据赋值时被重复追加到文件名。- 项目文件、导入的
.targets文件或自定义发布目标是否修改了相关项或路径。
重点是找出错误文件名第一次出现的位置。如果在 _CopyResolvedFilesToPublishAlways 之前,源文件就已经叫 app.publishMyApp.deps.json,应继续检查更早的生成或项目项处理步骤;如果文件名是在进入 ClickOnce 发布项后才改变,则应检查该阶段使用的路径和项元数据。
修复方向
找到产生错误名称的目标或项目项后,应在文件进入 ClickOnce 应用程序文件复制流程前,修正对应项的目标文件名,使载荷中的目标路径最终以 MyApp.deps.json 结尾。具体要修改哪个属性或元数据,取决于二进制日志中实际参与复制的项。现有日志没有显示该项的名称和元数据,因此不足以给出可靠的属性覆盖写法。
不要等到发布完成后再重命名载荷文件。ClickOnce 清单可能记录文件名或相关文件信息,事后修改可能导致清单与载荷不一致。修复后应重新发布,并检查 Application Files 目录和清单中的文件名是否一致。
注意事项
PublishDir 末级目录的变化与错误前缀之间的关联是重要线索,但相关性本身不能确认根因。目前可以确定的是,发布复制步骤使用了带错误名称的源文件。要确定准确的修复点,还需要查看完整构建日志。
备注:内容仅供参考。
