Dotnet 发布副本 appsettings*.json 仅适用于 Asp.Net(但不适用于控制台)
Dotnet publish copies appsettings*.json only for Asp.Net (but not Console)
我 运行 dotnet publish
(通过 VS2019 GUI 或命令,结果相同)在一个 ASP.Net 项目和一个控制台项目上。
行为似乎有所不同。所有 appsettings*.json
都在 ASP.Net 中自动复制,但只有在我将它们设置为 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
.
时才会在控制台上复制
这是某种错误还是它真的设计得因项目类型而异?
我觉得这个行为有点奇怪。
如果比较两个项目的 .csproj
文件,您会注意到 ASP.NET 核心项目引用了一个 SDK Microsoft.NET.Sdk.Web
,而控制台项目只引用了 Microsoft.NET.Sdk
. SDK 基本上是一组 pre-defined 配置和默认设置,可简化 ASP.NET 核心或控制台应用程序的工作,并使项目文件易于阅读和维护。
Microsoft.NET.Sdk.Web
实际上扩展了 Microsoft.NET.Sdk
,因此后者 SDK 所做的一切也包含在 Web SDK 中。 Web SDK 只是添加了一些 ASP.NET 核心相关的东西。这也意味着 Web 应用程序只是一个控制台应用程序。
Web SDK 包含的其中一行不包含在通用 SDK is the following:
<Content Include="**\*.json" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(DefaultWebContentItemExcludes)" />
这基本上将所有 .json
文件定义为应该复制到发布目录的内容。所以基本上这正是 ASP.NET 核心项目将 appsettings.json
文件复制到发布目录的原因。
由于这不是正常项目 SDK 的一部分,控制台应用程序不会自动将 appsettings.json
文件复制到发布目录。这通常是 故意的 因为原始控制台应用程序不一定构建在使用这些文件的配置系统上。
它是可能的(并且它可能在未来与 3.0 中的通用主机更相关)但不是默认值。因此,如果您想将文件复制到发布目录,那么您应该自己将该规则添加到您的 .csproj
:
<ItemGroup>
<Content Include="*.json" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>
顺便说一句。由于您在评论中提到 ASP.NET Core 并不真正 require appsettings.json
文件本身(这是绝对正确的),Web SDK 确实公开了两个属性 EnableDefaultItems
和 EnableDefaultContentItems
禁用此默认行为(以及其他一些行为)。
我 运行 dotnet publish
(通过 VS2019 GUI 或命令,结果相同)在一个 ASP.Net 项目和一个控制台项目上。
行为似乎有所不同。所有 appsettings*.json
都在 ASP.Net 中自动复制,但只有在我将它们设置为 <CopyToOutputDirectory>Always</CopyToOutputDirectory>
.
这是某种错误还是它真的设计得因项目类型而异?
我觉得这个行为有点奇怪。
如果比较两个项目的 .csproj
文件,您会注意到 ASP.NET 核心项目引用了一个 SDK Microsoft.NET.Sdk.Web
,而控制台项目只引用了 Microsoft.NET.Sdk
. SDK 基本上是一组 pre-defined 配置和默认设置,可简化 ASP.NET 核心或控制台应用程序的工作,并使项目文件易于阅读和维护。
Microsoft.NET.Sdk.Web
实际上扩展了 Microsoft.NET.Sdk
,因此后者 SDK 所做的一切也包含在 Web SDK 中。 Web SDK 只是添加了一些 ASP.NET 核心相关的东西。这也意味着 Web 应用程序只是一个控制台应用程序。
Web SDK 包含的其中一行不包含在通用 SDK is the following:
<Content Include="**\*.json" CopyToPublishDirectory="PreserveNewest" Exclude="$(DefaultItemExcludes);$(DefaultExcludesInProjectFolder);$(DefaultWebContentItemExcludes)" />
这基本上将所有 .json
文件定义为应该复制到发布目录的内容。所以基本上这正是 ASP.NET 核心项目将 appsettings.json
文件复制到发布目录的原因。
由于这不是正常项目 SDK 的一部分,控制台应用程序不会自动将 appsettings.json
文件复制到发布目录。这通常是 故意的 因为原始控制台应用程序不一定构建在使用这些文件的配置系统上。
它是可能的(并且它可能在未来与 3.0 中的通用主机更相关)但不是默认值。因此,如果您想将文件复制到发布目录,那么您应该自己将该规则添加到您的 .csproj
:
<ItemGroup>
<Content Include="*.json" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>
顺便说一句。由于您在评论中提到 ASP.NET Core 并不真正 require appsettings.json
文件本身(这是绝对正确的),Web SDK 确实公开了两个属性 EnableDefaultItems
和 EnableDefaultContentItems
禁用此默认行为(以及其他一些行为)。