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

lmc*_*iro 22 .net c# msbuild .net-core

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

在*.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(例如,避免Microsoft.AspNetCore.App@2.1.0在宿主项目和Microsoft.Extensions.Configuration@2.0.0类库项目中)?或者我只能Microsoft.AspNetCore.AppMicrosoft.NET.Sdk.WebSDK中使用metapackage ?

3)使用Microsoft.NET.Sdk或有什么区别Microsoft.NET.Sdk.Web?该文档称,"该SDK,作为分层文件描述,是一套MSBuild任务和目标,可以构建.NET的核心代码." ,但为什么我们需要同时拥有它们?在实践中,怎样Microsoft.NET.Sdk.Web做是Microsoft.NET.Sdk不?

Mar*_*ich 26

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

最重要的区别是:

  1. 默认项目

    Web SDK具有不同的定义和通配模式,以便将文件包含在已发布的应用程序中.

    例如,当你有一个appsettings.json文件,使用Web SDK的项目会自动包含它,因为有替代模式,保证.config,.json文件和所有文件的wwwroot文件夹是发布输出的一部分.有关这些模式,请参阅GitHub上的MSBuild源代码.

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

    <ItemGroup>
      <None Update="*.json" CopyToPublishDirectory="PreserveNewest" />
    </ItemGroup>
    
    Run Code Online (Sandbox Code Playgroud)
  2. Web发布逻辑

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

    如果您计划使用发布配置文件(.pubxml文件)或使用MSBuild/MSDeploy部署到azure或文件系统,则需要此发布逻辑.

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

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

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

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

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

对于2.1工具(!)(CLI 2.1.*)中的测试项目,它有点不同和棘手,请参阅集成和单元测试不再适用于ASP.NET Core 2.1无法在运行时查找程序集

从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>
Run Code Online (Sandbox Code Playgroud)

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

<ItemGroup>
  <FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)