发布错误: 发现多个具有相同相对路径的发布输出文件

当我发布我的 ABP 项目,我得到以下错误:

C:\Program Files\dotnet\sdk\6.0.100-rc.1.21458.32\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.ConflictResolution.targets(112,5): error NETSDK1152: Found multiple publish output files with the same relative path:


D:\Github\volo\abp\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\compilerconfig.json,
D:\Github\volo\abp\bookstore\src\Acme.BookStore.Theme\compilerconfig.json,


D:\Github\volo\abp\lepton-theme\src\Volo.Abp.AspNetCore.Mvc.UI.Theme.Lepton\package.json,
D:\Github\volo\abp\bookstore\src\Acme.BookStore.Web\package.json.


D:\Github\volo\abp\bookstore\src\Acme.BookStore.Web\Acme.BookStore.Web.csproj
64909 次浏览

问题:

这个问题在.NET 6迁移之后出现。 有一个新特性可以阻止将多个文件复制到具有相同文件名的相同目标目录。 请参阅 href = “ https://Learn.microsoft.com/en-us/dotnet/core/ 兼容/sdk/6.0/copy-files-in-output”rel = “ norefrer”> https://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/duplicate-files-in-output

解决方案 # 1(变通方法) :

您可以将以下构建属性添加到所有可发布(* . Web)项目的 * . csproj 文件中。 此属性将绕过此检查,并像前面一样在.NET5中工作。

<PropertyGroup>
<ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>
</PropertyGroup>

解决方案二:

排除要复制到输出文件夹的有问题的文件。 在这个例子中,我们将排除这些文件: compilerconfig.jsonpackage.json

将以下代码行添加到 common.props(位于解决方案的根目录中) :

<Content Remove="compilerconfig.json;package.json"/>
<None Include="compilerconfig.json;package.json">
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</None>

我可以通过在 < NETSdkError 條件 = “’$(_ ResolvedFileToPublishContainsDuplates)’= = ‘ 假的’”< = 这是最初的真实情况下设置 Microsoft.NET.CommuntResolution.target 文件来解决这个问题。

此文件位于“ Program Files dotnet sdk 6.0.100 Sdks Microsoft.NET.Sdk target”中

我在 Blazor WebAssembly 项目和一个相关的集成测试项目中遇到了这个问题,这两个项目都有 appsettings.json文件,当时我正在通过 GitHub 操作进行 dotnet publish操作。我发现了另外两种对我有效的方法(以及公认的答案) :

  1. <IsPublishable>false</IsPublishable >添加到测试项目
  2. dotnet publish命令中,直接通过参数指定 .csproj

这是由 .NET6 SDK 中的一个重大变化引起的,与。NET 版本的项目目标。例如,如果安装 VisualStudio2022,它将安装。NET 6 SDK,并将其用于构建和部署。

您可以通过在解决方案根目录中运行 dotnet new globaljson来生成 global.json文件,然后用所需的 SDK 版本替换 "version"属性值(使用 dotnet --list-sdks列出已安装的版本) ,从而强制 VS 使用较旧的 SDK 工具链。

我想这意味着如果你有一个项目依赖项 A-> B,其中 A 和 B 都是可执行的,并且有它们自己的 appsetings.json,那么最好将项目 B 拆分为一个 shell 项目 B1,appsetings.json 和 B2作为一个包含所有 B 功能的库。这样,依赖项 A-> B2和 B1-> B2就可以避免“多个发布输出文件”的问题。

以上的答案引导我找到了我的解决方案。我的案例是一个自我构建实体框架库项目,它在构建使用它的网站时,正在复制其 appsetings.json。

我的解决方案是让它复制到输出文件夹(当我在 VS * * 中进行迁移操作时) ,但是阻止它使用“ Never”值发布,因为它只在网站或 Web 服务下作为库发布。

<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>

* * 我的 EF 库项目根据这个 数据种子文章数据种子文章中的模式构建自己。

因此,我吃了我的蛋糕,并保持它。

如果您是在一个天蓝色的 devops 流水线中得到它,您可以添加以下任务来为您的构建指定 SDK 版本

- task: UseDotNet@2
displayName: 'Install .Net SDK version'
inputs:
packageType: sdk
version: x.x.xxx //example (3.1.416)
installationPath: $(Agent.ToolsDirectory)/dotnet

Https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/tool/dotnet-core-tool-installer?view=azure-devops

如果您的项目(同一解决方案的所有部分)使用同一个 nuget 包的不同版本,您将看到这个错误。现在,如果出于某种原因必须同时保留两个版本(这不是一个好的做法) ,你可以像其他人在答案中提到的那样找到一个变通方法。

或者做正确的事情,确保所有的项目使用相同的版本的软件包。要做到这一点,只需打开 Visual Studio 的 NuGet 软件包管理器就可以了,如屏幕截图所示

enter image description here

打开一个窗口,其顶部将有一个 consolidate选项卡,单击合并选项卡。在 如果存在版本冲突中,您将能够在左侧看到 NuGet 包的 lisr = t。如果是这种情况,就意味着存在冲突。单击任何包,您将能够看到您的解决方案的项目列表在右侧,就像下面的截图

enter image description here

在我的示例(屏幕快照)中,我有2个版本的 Microsoft.Net.Sdk.function 一个3.0.13和3.0.11。 所有您需要做的就是选择您的首选版本,并点击安装,两个项目将被更新到相同的版本。 推动变化和发展再次建立和享受

我在一个有 Razor 类库的 web 应用程序中遇到了这个问题,罪魁祸首是 LIBMAN.JSON 文件。

右键单击该文件并将该文件的属性更改为:

构建动作: 无

复制到输出目录: 不要复制

仅用于工具的其他文件也可能以相同的方式进行更改。

我还使用 compilerconfig.json编译 css 到 css。 通过 UI 最简单的解决方法是:

Open Solution Explorer->compilerconfig.json->right click->properties 然后就是:

Build Action: None
Copy to Output Directory: Do not copy

这样做是为了所有 developer.config 文件(在我的客户端项目和服务器上都是如此)

这背后的原因是,这个编译器配置只在构建过程中本地使用,但在以后运行应用程序时不需要它。

enter image description here