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

如果不同源路径中的文件复制到发布输出中的同一文件路径,.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 Web 服务的 ASP.NET Core 项目,每个项目都有自己的 appsettings.json 文件。
    • 在一个项目项中,CopyToOutputDirectory 被不必要地设置为 Always

    二进制日志文件 可用于查找重复文件的原因。

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

受影响的 API