将我的 Web 应用程序从 NET5 升级到 NET6 后,当尝试将我的 Web 应用程序推送到 Azure AppService 时,我收到 NETSDK1152 错误:
发现多个具有相同相对路径的发布输出文件: C:...\src\ProjA_ViewImports.cshtml, C:...\src\ProjB_ViewImports.cshtml, C:...\src\ProjC_ViewImports.cshtml
有问题的项目是 Razor 类库(Project Sdk="Microsoft.NET.Sdk.Razor"),它们都由常规 Web 应用程序 () 引用。有问题的文件是 _ViewImport.cshtml 文件,包含我的视图的常见使用/导入。它们只有标准属性,我从未更改过这些属性(操作 -> 内容,复制到输出目录 -> 不复制)。
在更新到 NET6 之前,无论是在我的本地计算机上还是在 Azure 上(发布和运行应用程序),一切都运行完美。升级到 .NET6 后,我开始收到上述错误。
但是,这只发生在我使用发布功能时(或者通过推送到远程 git 存储库来触发 CI/CD 时)。如果我在本地使用 dotnetpublish,一切似乎都可以正常发布。
尝试关闭错误的通常建议(例如,here),并没有为我解决任何问题。
除了完全删除 _ViewImport.cshtml 文件或重组项目之外,我不知道如何在保持结构不变的情况下潜在地解决这个问题。
来自 Microsoft 文档:
如果来自不同源路径的文件被复制到发布输出中的同一文件路径,.NET SDK(6.0.100 预览版 1)会生成新错误 (
NETSDK1152
)。当项目及其项目引用包含与发布输出中包含的同名文件时,可能会发生这种情况。
两个文件都被复制到同一目的地。要复制的第二个文件覆盖了第一个文件,而哪个文件“获胜”大多是任意的。
在某些情况下,构建会失败。例如,当尝试创建单文件应用程序时,捆绑程序失败并出现 ArgumentException,如以下构建输出所示:
C:\Program Files\dotnet\sdk\5.0.100-preview.5.20258.6\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.100-preview.5.20258.6\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.100-preview.5.20258.6\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
错误并列出重复的文件。
发布输出中的重复文件有时会导致构建中断或不可预测的行为。
理想情况下,您应该更新项目以避免将多个同名文件复制到发布输出的情况。错误消息包括重复文件的名称。重复文件的一些原因包括:
CopyToOutputDirectory
设置为 Always
的项目项。二进制日志文件对于查找重复文件的原因很有用。
或者,您可以将 ErrorOnDuplicatePublishOutputFiles 属性设置为
false
。