Microsoft.NET.Sdk和Microsoft.NET.Sdk.Web之间有什么区别 [英] What are the differences between Microsoft.NET.Sdk and Microsoft.NET.Sdk.Web

查看:867
本文介绍了Microsoft.NET.Sdk和Microsoft.NET.Sdk.Web之间有什么区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个主机项目的解决方案(一个是通用主机)和由这两个主机项目引用的类库项目.

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

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

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

关于正确的SDK和元包:

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

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

3)使用Microsoft.NET.SdkMicrosoft.NET.Sdk.Web有什么区别? 文档表示如分层文档所述,SDK是一组可以构建.NET Core代码的MSBuild任务和目标." ,但是为什么我们需要同时拥有它们?实际上,Microsoft.NET.Sdk没有什么Microsoft.NET.Sdk.Web?

解决方案

广告(1)和(3):核心"和Web SDK之间有什么区别,它们如何影响通用主机应用程序? >

最重要的区别是:

  1. 默认项目

    对于要在已发布的应用程序中包含哪些文件的文件,Web SDK具有不同的定义和标记模式.

    例如当您拥有一个appsettings.json文件时,使用Web sdk的项目将自动包含该文件,因为已有模式可以确保.config.json文件以及wwwroot文件夹中的所有文件都属于发布的一部分输出.请参阅

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    

  2. 网络发布逻辑

    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模板时).

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

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

对于使用2.1工具(!)(CLI 2.1.*)的测试项目,它有些不同且棘手,请参阅

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

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

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

I have a solution with two host projects (one is a Web Host and the other is a Generic Host) and a class library project referenced by those two host projects.

In the Sdk attribute of the root tag <Project> of the *.csproj file, both host projects (web host and generic host) are using Microsoft.NET.Sdk.Web, but the class library project uses the Microsoft.NET.Sdk.

The two host projects references the Microsoft.AspNetCore.App metapackage.

The class library project are using Microsoft.NETCore.App, but it references some ASP.NET Core packages individually (packages of Microsoft.AspNetCore.App that are not in Microsoft.NETCore.App).

About the correct SDK and metapackages:

1) In the generic host project, should I use pure .NET Core (Microsoft.NET.Sdk and Microsoft.NETCore.App) instead of ASP.NET Core (Microsoft.NET.Sdk.Web and Microsoft.AspNetCore.App) since it is not a web project?

2) In the class library project, is it fine to use Microsoft.NET.Sdk with Microsoft.AspNetCore.App to avoid the possibility to reference different versions of packages that belong to Microsoft.AspNetCore.App (to avoid for example, Microsoft.AspNetCore.App@2.1.0 in the host project and Microsoft.Extensions.Configuration@2.0.0 in the class library project)? Or I can only use Microsoft.AspNetCore.App metapackage with Microsoft.NET.Sdk.Web SDK?

3) What difference does it make to use Microsoft.NET.Sdk or Microsoft.NET.Sdk.Web? The docs says that "The SDK, as the layering document describes, is a set of MSBuild tasks and targets that can build .NET Core code.", but why do we need to have both of them? In practice, what Microsoft.NET.Sdk.Web does that Microsoft.NET.Sdk doesn't?

解决方案

Ad (1) and (3): What are the differences between the "core" and and web SDKs, how do these affect generic host apps?

The most important differences are:

  1. Default Items

    The web SDK has different definitions and globbing patterns for which files to include in your published application.

    E.g. when you have an appsettings.json file, projects using the web sdk will automatically include it since there are patterns in place that ensure that .config, .json files and all files in a wwwroot folder are all part of the publish output. See the MSBuild source code on GitHub for these patterns.

    If you have a generic host and don't use the Web SDK, you may need to add code to the csproj file to specify which files to copy to the publish directory (or use an IDE to change the "copy to output directory" setting which also includes files in the publish output but will also copy them to the build output):

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    

  2. Web Publish logic

    Another essential part of the Web SDK is that it contains the deployment logic for web applications.

    If you plan to use publish profiles (.pubxml files) or deploy to azure or filesystems using MSBuild / MSDeploy, you will need this publishing logic.

Ad (2): Which SDK to use for class libraries?

For maximum compatibility when publishing public libraries (e.g. via NuGet), use the core SDK and reference individual packages with the lowest possible version - e.g. 2.1.0 / 2.1.1.

If you develop a class library containing razor views, you will need to use the Microsoft.NET.Sdk.Razor SDK to get razor tooling (e.g. when you use the dotnet new razorclasslib template).

For libraries and test projects where you want to use the same meta package reference as the application, things are a bit complicated at the moment but it's going to get better:

For ASP.NET Core 2.1 tools(!) (CLI 2.1.*), I suggest using the non-web SDK for class libraries and use the version 2.1.1 of that package. Don't ever upgrade it, even if NuGet offers you an upgrade.

For test projects in 2.1 tools(!) (CLI 2.1.*), it is a bit different and tricky, see Integration and unit tests no longer work on ASP.NET Core 2.1 failing to find assemblies at runtime

Beginning in 2.2 tools (CLI 2.2.100+), the version-less package references to ASP.NET Core metapackages are moved to the core SDK so you can develop libraries and test projects for both ASP.NET Core 2.1 and 2.2 using the ""core"" SDK (provided you use tools 2.2.100+) using version-less package references:

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

In .NET Core / ASP.NET Core 3.0, you will be able to reference the framework via a new mechanism altogether (no web-SDK needed):

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

这篇关于Microsoft.NET.Sdk和Microsoft.NET.Sdk.Web之间有什么区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆