针对发布输出中的重复文件生成错误

.NET SDK 会生成一个新错误 (NETSDK1152):当将不同源路径的文件复制到发布输出中的同一文件路径时,会生成错误。 当项目及其项目引用中包含了与发布输出中包含的文件同名的文件时,可能会发生这种情况。

引入的版本

.NET SDK 6.0.100

旧行为

这两个文件复制到了同一个目标。 要复制的第二个文件覆盖了第一个文件,最终哪个文件会“胜出”在很大程度上是随机的。

在某些情况下生成失败。 例如,尝试创建单文件应用时,捆绑程序失败并出现 ArgumentException,如以下生成输出中所示:

C:\Program Files\dotnet\sdk\5.0.403\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(962,5): error MSB4018: The "GenerateBundle" task failed unexpectedly. [C:\repro\repro.csproj]
C:\Program Files\dotnet\sdk\5.0.403\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(962,5): error MSB4018: System.ArgumentException: Invalid input specification: Found multiple entries with the same BundleRelativePath [C:\repro\repro.csproj]
C:\Program Files\dotnet\sdk\5.0.403\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Publish.targets(962,5): error MSB4018: at Microsoft.NET.HostModel.Bundle.Bundler.GenerateBundle(IReadOnlyList`1 fileSpecs) [C:\repro\repro.csproj]

新行为

从 .NET 6 开始,MSBuild 会删除当源和目标相同时复制到发布文件夹中的重复文件。 如果有任何剩余的重复项,将生成 NETSDK1152 错误并列出重复的文件。

更改原因

发布输出中的重复文件有时会导致生成中断或不可预测的行为。

  • 理想情况下,应更新项目,以避免将多个同名文件复制到发布输出。 错误消息包含重复文件的名称。 导致文件重复的一些原因包括:

    • 一个 ASP.NET Core 项目引用一个 ASP.NET Core Web 服务,且每个项目具有自己的 appsettings.json 文件。
    • 在一个项目项中,CopyToOutputDirectory 被不必要地设置为 Always

    若要查找导致文件重复的原因,二进制日志文件可能很有用。

  • 或者,可以将 ErrorOnDuplicatePublishOutputFiles 属性设置为 false

受影响的 API

不适用