Dotnet 发布副本 appsettings*.json 仅适用于 Asp.Net(但不适用于控制台)

Dotnet publish copies appsettings*.json only for Asp.Net (but not Console)

我 运行 dotnet publish(通过 VS2019 GUI 或命令,结果相同)在一个 ASP.Net 项目和一个控制台项目上。

行为似乎有所不同。所有 appsettings*.json 都在 ASP.Net 中自动复制,但只有在我将它们设置为 <CopyToOutputDirectory>Always</CopyToOutputDirectory>.

时才会在控制台上复制

这是某种错误还是它真的设计得因项目类型而异?

我觉得这个行为有点奇怪。

如果比较两个项目的 .csproj 文件,您会注意到 ASP.NET 核心项目引用了一个 SDK Microsoft.NET.Sdk.Web,而控制台项目只引用了 Microsoft.NET.Sdk . SDK 基本上是一组 pre-defined 配置和默认设置,可简化 ASP.NET 核心或控制台应用程序的工作,并使项目文件易于阅读和维护。

Microsoft.NET.Sdk.Web 实际上扩展了 Microsoft.NET.Sdk,因此后者 SDK 所做的一切也包含在 Web SDK 中。 Web SDK 只是添加了一些 ASP.NET 核心相关的东西。这也意味着 Web 应用程序只是一个控制台应用程序。

Web SDK 包含的其中一行包含在通用 SDK is the following:

<Content Include="**\*.json" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(DefaultWebContentItemExcludes)" />

这基本上将所有 .json 文件定义为应该复制到发布目录的内容。所以基本上这正是 ASP.NET 核心项目将 appsettings.json 文件复制到发布目录的原因。

由于这不是正常项目 SDK 的一部分,控制台应用程序不会自动将 appsettings.json 文件复制到发布目录。这通常是 故意的 因为原始控制台应用程序不一定构建在使用这些文件的配置系统上。

它是可能的(并且它可能在未来与 3.0 中的通用主机更相关)但不是默认值。因此,如果您想将文件复制到发布目录,那么您应该自己将该规则添加到您的 .csproj:

<ItemGroup>
    <Content Include="*.json" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>

顺便说一句。由于您在评论中提到 ASP.NET Core 并不真正 require appsettings.json 文件本身(这是绝对正确的),Web SDK 确实公开了两个属性 EnableDefaultItemsEnableDefaultContentItems 禁用此默认行为(以及其他一些行为)。