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

Ily*_*dik 5 .net .net-core asp.net-core dotnet-publish

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

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

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

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

pok*_*oke 9

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

\n\n

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

\n\n

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

\n\n
<Content Include="**\\*.json" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(DefaultWebContentItemExcludes)" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n
<ItemGroup>\n    <Content Include="*.json" CopyToPublishDirectory="PreserveNewest" />\n</ItemGroup>\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n