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

Nad*_*ard 202 c# publish azure .net-6.0

当我发布 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
Run Code Online (Sandbox Code Playgroud)

Nad*_*ard 383

问题:

.NET 6 迁移后会出现此问题。有一项新功能可以阻止将多个文件复制到具有相同文件名的同一目标目录。请参阅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>
Run Code Online (Sandbox Code Playgroud)

解决方案#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>
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这是一个重大变化。为什么多个可执行项目级别的 appsettings.json 文件被复制到同一输出目录?每一项都针对每个项目。问题似乎是存在一个问题,但他们没有解决它,而是把它变成了其他人的问题。 (31认同)
  • 是否可以为单个文件覆盖此设置?如果有 proj B 的场景取决于 proj A。两者都会发出 appsettings.json。在这种特定情况下,您实际上希望 proj B 覆盖 proj A 中的 appsettings.json。 (17认同)
  • 我在并排安装 VS 2022 与 VS 2019 后遇到了这个问题,尽管错误的解决方案仍在使用 .NET 5 的 VS 2019 中构建。解决方案 #1 似乎在短期内对我有用 - 谢谢! (16认同)
  • 确认这对我来说也是问题。由于发现自动生成的 XML 文档文件“MyApi.xml”重复,Azure Pipelines 自最近更新(~2021 年 12 月)以来停止构建。从 .csproj 中删除 &lt;CopyToOutputDirectory&gt;Always&lt;/CopyToOutputDirectory&gt; 部分修复了我的情况。 (6认同)
  • 应该注意的是,如果您使用解决方案#1,则不需要将其添加到所有可发布的内容中,只需将其添加到出现此错误的可发布内容中即可。在我们的例子中,我们有大约 9 个项目文件构建到 Azure Service Fabric - 我们只需要更新其中 2 个。 (6认同)
  • 也许在 &lt;PropertyGroup&gt; 中添加描述特定位置,其中应添加解决方案#1,对于喜欢的人,但没有注意解释,:) (4认同)

che*_*rry 36

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

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

<ItemGroup>
<Content Include="appsettings.json">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
</Content>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

** 我的 EF 库项目根据这篇数据播种文章中的模式自行构建。

这样我就可以吃掉我的蛋糕并保留它。

  • 蛋糕是一个谎言 (6认同)
  • 你能告诉我更多关于蛋糕的事吗? (5认同)
  • @MarkCooper,我会指出你在另一个网站,但我找不到烹饪、美食、食物、营养、饮食或蛋糕的堆栈交换网站。 (5认同)
  • @cherry我认为这就是你需要的:https://cooking.stackexchange.com/ (4认同)

JCi*_*sar 13

如果您在 azure devops pipleline 中获取此内容,您可以添加以下任务来指定构建的 SDK 版本

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

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

  • 有关此问题在 ADO 管道中不起作用的问题。我有一个运行 windows-latest 的管道,自 2021 年 8 月以来一直成功运行。windows-latest 映像中是否存在更改导致此失败?昨天开始失败。 (2认同)

Ben*_*ica 9

我在 Blazor WebAssembly 项目和关联的集成测试项目中遇到了这个问题,appsettings.json当我dotnet publish通过 GitHub 操作出去时,这两个项目都有文件。我发现了另外两种对我有用的方法(以及已接受的答案):

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

  • 供参考 1 根据参考材料,特别需要位于属性组中 (2认同)

Ali*_*odi 8

我在使用具有 Razor 类库的 Web 应用程序时遇到了这个问题。罪魁祸首文件是 LIBMAN.JSON。

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

构建操作:无

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

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


ssa*_*mko 7

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

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

Build Action: None
Copy to Output Directory: Do not copy
Run Code Online (Sandbox Code Playgroud)

对所有的compiler.config文件执行此操作(在我的例子中是在客户端项目以及服务器上)

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

在此输入图像描述


Mar*_*man 5

这是由.NET 6 SDK 中的重大更改引起的,并且与您的项目目标的 .NET 版本无关。例如,如果您安装 Visual Studio 2022,它将安装 .NET 6 SDK 并使用它进行构建和部署。

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

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