我有一个包含两个宿主项目(一个是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.Sdk
和Microsoft.NETCore.App
)而不是 ASP.NET Core >(Microsoft.NET.Sdk.Web
和Microsoft.AspNetCore.App
),因为它不是网络项目?
2)在类库项目中,可以将Microsoft.NET.Sdk
与Microsoft.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.Sdk
或Microsoft.NET.Sdk.Web
有什么区别? Sdk说,“如分层文档所述,SDK是一组可以构建.NET Core代码的MSBuild任务和目标。” ,但是为什么我们需要拥有两个都?实际上,Microsoft.NET.Sdk.Web
没有做什么Microsoft.NET.Sdk
?
答案 0 :(得分:17)
广告(1)和(3):“核心”和Web SDK之间有什么区别,它们如何影响通用宿主应用?
最重要的区别是:
默认项目
对于要在已发布的应用程序中包含哪些文件的Web SDK,其定义和定义方式不同。
例如当您拥有appsettings.json
文件时,使用Web sdk的项目将自动包含该文件,因为已有模式可确保.config
,.json
文件以及{{1}中的所有文件}文件夹都是发布输出的一部分。参见the MSBuild source code on GitHub for these patterns。
如果您具有通用主机,并且不使用Web SDK,则可能需要向csproj文件中添加代码,以指定要复制到发布目录的文件(或使用IDE更改“将副本复制到输出”目录”设置,该设置还将文件包含在发布输出中,但也会将它们复制到构建输出中):
wwwroot
网络发布逻辑
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>