Dotnet仅针对Asp.Net发布副本appsettings * .json(但不针对Console)

时间:2019-06-05 09:28:23

标签: .net asp.net-core .net-core dotnet-publish

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

似乎行为有所不同。所有appsettings*.json都会在ASP.Net中自动复制,但是只有在我将它们设置为<CopyToOutputDirectory>Always</CopyToOutputDirectory>的情况下,才会在控制台上复制。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

Web SDK包含的以下行之一是普通SDK is the following中包含的

<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本身并不是真正的 require appsettings.json文件(这是绝对正确的),因此Web SDK确实公开了两个属性EnableDefaultItemsEnableDefaultContentItems禁用此默认行为(以及其他一些行为)。