.net - Dotnet 发布副本 appsettings*.json 仅适用于 Asp.Net(但不是控制台)
问题描述
我dotnet publish
在 ASP.Net 项目和控制台项目上运行(通过 VS2019 GUI 或命令,相同的结果)。
似乎行为不同。所有appsettings*.json
内容都在 ASP.Net 中自动复制,但只有在我将它们设置为<CopyToOutputDirectory>Always</CopyToOutputDirectory>
.
这是某种错误还是真的设计为根据项目类型而有所不同?
这种行为对我来说有点奇怪。
解决方案
如果比较.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 确实公开了两个属性EnableDefaultItems
并EnableDefaultContentItems
禁用了此默认行为(以及其他一些行为)。
推荐阅读
- html - 这些圆形进度条是如何填充的?
- plsql - 当我将数据从表“TABLE_1”移动到表“TABLE_2”时,列大小有时不合适。oracle 发送错误如下
- javascript - Convert MySQL "where" to Sequelizejs "where"
- json - 如何将具有 JSON 值的 Cassandra 表中的数据导出到 CSV 文件?
- azure - 如何创建 AADAuthenticationProperties (azure) 的 bean?
- nvm - 安装 nvm、节点和设置路径后,“节点”不被识别为内部或外部命令
- python - 对大量数据进行矩阵分解的推荐系统会产生 MemoryError
- android - 如何在 MapMyIndia android SDK 中实现汽车移动动画
- tensorflow - 使用神经网络进行面部识别
- wordpress - 视觉作曲家将双引号(“某些文本”)转换为反引号(“某些文本”)