我dotnet publish
在 ASP.Net 项目和控制台项目上运行(通过 VS2019 GUI 或命令,相同的结果)。
似乎行为不同。所有appsettings*.json
内容都在 ASP.Net 中自动复制,但只有在我将它们设置为<CopyToOutputDirectory>Always</CopyToOutputDirectory>
.
这是某种错误还是真的设计为根据项目类型而有所不同?
这种行为对我来说有点奇怪。
我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
禁用了此默认行为(以及其他一些行为)。