Microsoft.NET.Sdk和Microsoft.NET.Sdk.Web之间有什么区别

时间:2018-09-20 23:40:11

标签: c# .net msbuild .net-core

我有一个包含两个宿主项目(一个是Web Host,另一个是Generic Host)的解决方案,并且有一个由这两个宿主项目引用的类库项目。

在* .csproj文件的根标记<Project>的{​​{3}}属性中,两个主机项目(Web主机和通用主机)都使用Microsoft.NET.Sdk.Web,但类库项目使用Microsoft.NET.Sdk

两个宿主项目引用Microsoft.AspNetCore.App元包。

类库项目正在使用Microsoft.NETCore.App,但是它单独引用了一些ASP.NET Core程序包(不在Microsoft.AspNetCore.App中的Microsoft.NETCore.App程序包)。

关于正确的SDK和元包:

1)在通用宿主项目中,我应该使用纯 .NET Core Microsoft.NET.SdkMicrosoft.NETCore.App)而不是 ASP.NET Core >(Microsoft.NET.Sdk.WebMicrosoft.AspNetCore.App),因为它不是网络项目?

2)在类库项目中,可以将Microsoft.NET.SdkMicrosoft.AspNetCore.App一起使用,以避免引用属于Microsoft.AspNetCore.App的软件包的不同版本的可能性(例如,避免,宿主项目中的Microsoft.AspNetCore.App@2.1.0和类库项目中的Microsoft.Extensions.Configuration@2.0.0)?或者我只能将Microsoft.AspNetCore.App元数据包与Microsoft.NET.Sdk.Web SDK一起使用?

3)使用Microsoft.NET.SdkMicrosoft.NET.Sdk.Web有什么区别? Sdk说,“如分层文档所述,SDK是一组可以构建.NET Core代码的MSBuild任务和目标。” ,但是为什么我们需要拥有两个都?实际上,Microsoft.NET.Sdk.Web没有做什么Microsoft.NET.Sdk

1 个答案:

答案 0 :(得分:17)

广告(1)和(3):“核心”和Web SDK之间有什么区别,它们如何影响通用宿主应用?

最重要的区别是:

  1. 默认项目

    对于要在已发布的应用程序中包含哪些文件的Web SDK,其定义和定义方式不同。

    例如当您拥有appsettings.json文件时,使用Web sdk的项目将自动包含该文件,因为已有模式可确保.config.json文件以及{{1}中的所有文件}文件夹都是发布输出的一部分。参见the MSBuild source code on GitHub for these patterns

    如果您具有通用主机,并且不使用Web SDK,则可能需要向csproj文件中添加代码,以指定要复制到发布目录的文件(或使用IDE更改“将副本复制到输出”目录”设置,该设置还将文件包含在发布输出中,但也会将它们复制到构建输出中):

    wwwroot
  2. 网络发布逻辑

    Web SDK的另一个重要部分是它包含Web应用程序的部署逻辑。

    如果您打算使用发布配置文件(<ItemGroup> <None Update="*.json" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup> 文件)或使用MSBuild / MSDeploy部署到Azure或文件系统,则将需要此发布逻辑。

广告(2):用于类库的哪个SDK?

要在发布公共库(例如通过NuGet)时获得最大的兼容性,请使用核心SDK并引用具有最低版本的单个软件包-例如2.1.0 / 2.1.1。

如果开发包含剃刀视图的类库,则需要使用.pubxml SDK来获得剃刀工具(例如,当您使用Microsoft.NET.Sdk.Razor模板时)。

对于要使用与应用程序相同的meta包引用的库和测试项目,目前情况有些复杂,但是会变得更好:

对于ASP.NET Core 2.1工具(!)(CLI 2.1。*),我建议将非Web SDK用于类库,并使用该软件包的2.1.1版本。即使NuGet为您提供了升级,也永远不要升级它。

对于2.1工具(!)(CLI 2.1。*)中的测试项目,它有些不同且棘手,请参阅Integration and unit tests no longer work on ASP.NET Core 2.1 failing to find assemblies at runtime

从2.2工具(CLI 2.2.100+)开始,对ASP.NET Core元软件包的无版本软件包引用已移至核心SDK,因此您可以为ASP.NET Core 2.1和2.2开发库并测试项目使用“无核” SDK(前提是您使用工具2.2.100+),并且使用无版本软件包引用:

dotnet new razorclasslib

在.NET Core / ASP.NET Core 3.0中,您将能够通过新机制完全引用框架(无需使用Web-SDK):

<ItemGroup>
  <PackageReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>