【问题标题】:.NET Core 6 Found multiple publish output files with the same relative path.NET Core 6 发现多个发布输出文件具有相同的相对路径
【发布时间】:2022-01-01 03:02:59
【问题描述】:

我在 .NET Core 6 上遇到了一个相对较新的问题,当通过 Visual Studio 2022 使用 Web Deploy 发布时。我收到以下错误:

错误发现多个具有相同相对路径的发布输出文件: C:\Work\MySolution\A\appsettings.json, C:\Work\MySolution\B\appsettings.json, C:\Work\MySolution\A\appsettings.Staging.json, C:\Work\MySolution\B\appsettings.Staging.json, , C:\Work\MySolution\A\appsettings.Development.json, C:\Work\MySolution\B\appsettings.Development.json

构建时没有问题,只是发布。

我有两个 ASP.NET Core 6 项目。项目“A”引用了项目“B”(我知道 B 确实应该是一个类库,但跟我走吧)。

我知道这是 .NET Core 6 (https://docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/duplicate-files-in-output) 中的预期功能。但是,我似乎无法告诉项目“A”忽略项目“B”的 appsettings 文件。我知道我可以设置 ErrorOnDuplicatePublishOutputFiles 属性,但我试图严格告诉它不要包含这些文件。

以下是一些我尝试过但不起作用的项目示例。

示例 1: 尝试了典型的内容更新方法(据说在 VS 15.3 之后不起作用)。也尝试使用绝对路径。

A.csproj

...

<ItemGroup>
  <ProjectReference Include="..\B\B.csproj">
    <PrivateAssets>all</PrivateAssets>
  </ProjectReference>
</ItemGroup>
  
<ItemGroup>    
  <Content Update="..\B\appsettings.json" CopyToOutputDirectory="Never" CopyToPublishDirectory="Never" />
  <Content Update="..\B\appsettings.*.json" CopyToOutputDirectory="Never" CopyToPublishDirectory="Never" />
</ItemGroup>

...

示例 2: 尝试了典型的内容删除方法。也尝试使用绝对路径。

A.csproj

...

<ItemGroup>
  <ProjectReference Include="..\B\B.csproj">
    <PrivateAssets>all</PrivateAssets>
  </ProjectReference>
</ItemGroup>
  
<ItemGroup>    
  <Content Remove="..\B\appsettings.json" />
  <Content Remove="..\B\appsettings.*.json" />
</ItemGroup>

<ItemGroup>    
  <None Include="..\B\appsettings.json" />
  <None Include="..\B\appsettings.*.json" />
</ItemGroup>

...

示例 3:我尝试使用 GeneratePathProperty 路径来确保它直接忽略了项目 B 的文件。

A.csproj

...

<ItemGroup>
  <ProjectReference Include="..\B\B.csproj" GeneratePathProperty="true">
    <PrivateAssets>all</PrivateAssets>
  </ProjectReference>
</ItemGroup>
  
<ItemGroup>    
  <Content Update="$(PkgB)\appsettings.json" CopyToPublishDirectory="Never" />
  <Content Update="$(PkgB)\appsettings.*.json" CopyToPublishDirectory="Never" />
</ItemGroup>

...

示例 4: 修改 pubxml 以忽略特定文件。也尝试使用绝对路径。

A.pubxml

...

<ExcludeFilesFromDeployment>..\B\appsettings.json;..\B\appsettings.Staging.json;...</ExcludeFilesFromDeployment> 

...

示例 5: 修改 pubxml 文件以明确忽略项目 B 文件。也尝试过绝对路径。

A.pubxml

...

<ItemGroup>
  <ResolvedFileToPublish Include="..\B\appsettings.json">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </ResolvedFileToPublish>
  <ResolvedFileToPublish Include="..\B\appsettings.Staging.json">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </ResolvedFileToPublish>
  <ResolvedFileToPublish Include="..\B\appsettings.Development.json">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </ResolvedFileToPublish>
  <ResolvedFileToPublish Include="..\B\appsettings.Backup.json">
    <CopyToPublishDirectory>Never</CopyToPublishDirectory>
  </ResolvedFileToPublish>
</ItemGroup>

...

我尝试了其他各种组合,但似乎都不起作用......

  • Windows 10
  • Visual Studio 2022(最新)
  • .NET Core 6

【问题讨论】:

    标签: visual-studio asp.net-core .net-6.0 visual-studio-2022 asp.net-core-6.0


    【解决方案1】:

    我在将 .NET 5 Web 服务升级到 .NET 6 时遇到了这个问题。正如您提供的链接所指出的,这是设计使然。我通过在两个项目中重命名 appsettings.json 文件来修复它,方法是在程序集名称前面加上,然后重新配置配置(是的,就是这样),如下所示:

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureAppConfiguration((context, configBuilder) =>
                {
                    string assemblyName = Assembly.GetExecutingAssembly().GetName().Name;
                    string envName = context.HostingEnvironment.EnvironmentName;
                    configBuilder.Sources.Clear();
                    configBuilder.AddJsonFile($"{assemblyName}.appsettings.json", optional: false, reloadOnChange: true);
                    configBuilder.AddJsonFile($"{assemblyName}.appsettings.{envName}.json", optional: true, reloadOnChange: true);
                });
                webBuilder.UseStartup<Startup>();
    

    如您所见,此时我们的代码仍然是“.NET 5 风格”。

    【讨论】:

    • 嗨,保罗。是的,这可能适用于应用程序设置。但是,像 web.config 这样的文件或 wwwroot 文件夹中无法重命名但两个项目共享的文件呢?我询问了 .NET 团队的一部分,他们提到“如果需要,您可以在 GetCopyTo(Output|Publish)DirectoryItems 之前编写一些 MSBuild 目标来删除文件,但这超出了我们在此跟踪器中处理的问题的范围。”有什么想法吗?
    • 我遇到的唯一冲突是 appsettings.json。我没有其他文件的答案。根据 [推荐操作] (docs.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/…),听起来官方的指导是确保没有文件名冲突——这可能需要做一些工作。
    【解决方案2】:

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

    将文件的属性更改为:

    构建操作:

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

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

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 2014-05-06
      相关资源
      最近更新 更多