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

问题描述 投票:13回答:1

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

在* .csproj文件的根标记Sdk<Project>属性中,两个主机项目(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),因为它不是一个Web项目吗?

2)在类库项目中,可以使用Microsoft.NET.SdkMicrosoft.AspNetCore.App来避免引用属于Microsoft.AspNetCore.App的不同版本的包的可能性(例如,避免在主题项目中使用[email protected],在类库项目中使用[email protected])?或者我只能使用Microsoft.AspNetCore.App metapackage与Microsoft.NET.Sdk.Web SDK?

3)使用Microsoft.NET.SdkMicrosoft.NET.Sdk.Web有什么不同? docs说“SDK,正如分层文档描述的那样,是一组可以构建.NET核心代码的MSBuild任务和目标。”,但为什么我们需要同时拥有它们?在实践中,Microsoft.NET.Sdk.Web做什么Microsoft.NET.Sdk没有?

c# .net msbuild .net-core
1个回答
16
投票

广告(1)和(3):“核心”和网络SDK之间有什么区别,这些如何影响通用主机应用?

最重要的区别是:

  1. 默认项目 Web SDK具有不同的定义和通配模式,以便将文件包含在已发布的应用程序中。 例如。当你有一个appsettings.json文件时,使用web sdk的项目将自动包含它,因为有一些模式可以确保.config.json文件和wwwroot文件夹中的所有文件都是发布输出的一部分。见the MSBuild source code on GitHub for these patterns。 如果您有通用主机但不使用Web SDK,则可能需要向csproj文件添加代码以指定要复制到发布目录的文件(或使用IDE更改“复制到输出目录”设置其中还包括发布输出中的文件,但也会将它们复制到构建输出中): <ItemGroup> <None Update="*.json" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup>
  2. Web发布逻辑 Web SDK的另一个重要部分是它包含Web应用程序的部署逻辑。 如果您计划使用发布配置文件(.pubxml文件)或使用MSBuild / MSDeploy部署到azure或文件系统,则需要此发布逻辑。

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

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

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

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

对于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+):

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

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

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
© www.soinside.com 2019 - 2024. All rights reserved.