PAYATHON 2026

.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,并沿日志向前检查:

  1. 哪个任务首次生成或复制了 app.publishMyApp.deps.json。
  2. 文件进入 ClickOnce 发布项集合时,Identity、TargetPath、Link、RelativeDir 等元数据分别是什么。
  3. PublishDir 的末级目录是否在路径拼接或元数据赋值时被重复追加到文件名。
  4. 项目文件、导入的 .targets 文件或自定义发布目标是否修改了相关项或路径。

重点是找出错误文件名第一次出现的位置。如果在 _CopyResolvedFilesToPublishAlways 之前,源文件就已经叫 app.publishMyApp.deps.json,应继续检查更早的生成或项目项处理步骤;如果文件名是在进入 ClickOnce 发布项后才改变,则应检查该阶段使用的路径和项元数据。

修复方向

找到产生错误名称的目标或项目项后,应在文件进入 ClickOnce 应用程序文件复制流程前,修正对应项的目标文件名,使载荷中的目标路径最终以 MyApp.deps.json 结尾。具体要修改哪个属性或元数据,取决于二进制日志中实际参与复制的项。现有日志没有显示该项的名称和元数据,因此不足以给出可靠的属性覆盖写法。

不要等到发布完成后再重命名载荷文件。ClickOnce 清单可能记录文件名或相关文件信息,事后修改可能导致清单与载荷不一致。修复后应重新发布,并检查 Application Files 目录和清单中的文件名是否一致。

注意事项

PublishDir 末级目录的变化与错误前缀之间的关联是重要线索,但相关性本身不能确认根因。目前可以确定的是,发布复制步骤使用了带错误名称的源文件。要确定准确的修复点,还需要查看完整构建日志。

备注:内容仅供参考。