Publish error: Found multiple publish output files with the same relative path

Publish error: Found multiple publish output files with the same relative path

当我发布我的 ABP 项目时,出现以下错误:

C:\Program Files\dotnet\sdk.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

问题:

.NET 6 迁移后出现此问题。 有一项新功能可以阻止多个文件被复制到具有相同文件名的同一目标目录。 参见 https://docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/duplicate-files-in-output

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

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

<ErrorOnDuplicatePublishOutputFiles>false</ErrorOnDuplicatePublishOutputFiles>

解决方案 #2:

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

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

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

我能够通过在

此文件位于“\Program Files\dotnet\sdk.0.100\Sdks\Microsoft.NET.Sdk\targets”

我 运行 通过一个 Blazor WebAssembly 项目和一个相关的集成测试项目进入了这个项目,这两个项目都有 appsettings.json 个文件,而我 dotnet publish 通过 GitHub 行动。我发现了另外两种对我有用的方法(以及已接受的答案):

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

这是由 a breaking change in the .NET 6 SDK 引起的,与您的项目目标的 .NET 版本无关。例如,如果您安装 Visual Studio 2022,它将安装 .NET 6 SDK 并将其用于构建和部署。

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

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

以上答案使我找到了解决方案。我的案例是一个自建 Entity Framework 图书馆项目,现在在构建使用它的网站时复制了它的 appsettings.json。

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

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

** 我的 EF 库项目根据 data-seeding article.

中的模式自行构建

我的蛋糕就是这样吃的,然后留着的。

如果您在 azure 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://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/tool/dotnet-core-tool-installer?view=azure-devops

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

或者做正确的事,确保所有项目都使用相同版本的包。为此,只需打开 Visual studio 的解决方案 NuGet 包管理器,如屏幕截图所示

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

在我的示例(截图)中,我有 2 个版本的 Microsoft.Net.Sdk.Functions 一个是 3.0.13 和 3.0.11。 您需要做的就是 select 您的首选版本,然后单击安装,两个项目将更新为相同的版本。 再次推送更改和 devops 构建并享受

我 运行 使用具有 Razor Class 库的 Web 应用程序解决了这个问题。罪魁祸首文件是 LIBMAN.JSON.

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

生成操作:NONE

复制到输出目录:请勿复制

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

我还使用 compilerconfig.json 将 scss 编译为 css。 通过 UI 最简单的修复是:

Open Solution Explorer->compilerconfig.json->right click->properties 并设置:

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

对所有 compiler.config 文件执行此操作(在我的情况下,在客户端项目和服务器上)

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