.NET Core 6 发现多个具有相同相对路径的发布输出文件

use*_*202 15 visual-studio asp.net-core asp.net-core-6.0 .net-6.0 visual-studio-2022

我在 .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://learn.microsoft.com/en-us/dotnet/core/compatibility/sdk/6.0/duplicate-files-in-output)。但是,我似乎无法告诉项目“A”忽略项目“B”appsettings 文件。我知道我可以设置 ErrorOnDuplicatePublishOutputFiles 属性,但我试图严格告诉它不要包含这些文件。

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

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

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>

...
Run Code Online (Sandbox Code Playgroud)

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

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>

...
Run Code Online (Sandbox Code Playgroud)

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

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>

...
Run Code Online (Sandbox Code Playgroud)

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

pubxml

...

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

...
Run Code Online (Sandbox Code Playgroud)

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

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>

...
Run Code Online (Sandbox Code Playgroud)

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

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

Pau*_*ams 6

我在将 .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>();
Run Code Online (Sandbox Code Playgroud)

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