首页 > 解决方案 > Dotnet 发布副本 appsettings*.json 仅适用于 Asp.Net(但不是控制台)

问题描述

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

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

这是某种错误还是真的设计为根据项目类型而有所不同?

这种行为对我来说有点奇怪。

标签: .netasp.net-core.net-coredotnet-publish

解决方案


如果比较.csproj两个项目的文件,您会注意到 ASP.NET Core 项目引用了 SDK Microsoft.NET.Sdk.Web,而控制台项目仅引用了Microsoft.NET.Sdk. SDK 基本上是一组预定义的配置和默认设置,以使使用 ASP.NET Core 或控制台应用程序变得简单,并且项目文件易于阅读和维护。

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

Web SDK 包含的包含在通用 SDK中的行之一如下

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

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

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

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

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

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


推荐阅读