问题描述
我有两个主机项目的解决方案(一个是 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.Sdk
和Microsoft.NETCore.App
),而不是 ASP.NET Core (和Microsoft.AspNetCore.App
),因为它不是网络项目?
2)在类库项目中,将Microsoft.NET.Sdk
与Microsoft.AspNetCore.App
一起使用可以避免引用属于Microsoft.AspNetCore.App
的软件包的不同版本的可能性(例如,避免在主机项目和类库项目中的Microsoft.Extensions.Configuration@2.0.0
)?还是我只能将Microsoft.AspNetCore.App
元数据包与Microsoft.NET.Sdk.Web
SDK一起使用?
3)使用Microsoft.NET.Sdk
或Microsoft.NET.Sdk.Web
有什么区别? 文档表示如分层文档所述,SDK是一组可以构建.NET Core代码的MSBuild任务和目标." ,但是为什么我们需要同时拥有它们?实际上,Microsoft.NET.Sdk
没有什么Microsoft.NET.Sdk.Web
?
广告(1)和(3):核心"和Web SDK之间有什么区别,它们如何影响通用主机应用程序? >
最重要的区别是:
-
默认项目
对于要在已发布的应用程序中包含哪些文件的文件,Web SDK具有不同的定义和标记模式.
例如当您拥有一个
appsettings.json
文件时,使用Web sdk的项目将自动包含该文件,因为已有模式可以确保.config
,.json
文件以及wwwroot
文件夹中的所有文件都属于发布的一部分输出.请参阅 GitHub上针对这些模式的MSBuild源代码.如果您拥有通用主机并且不使用Web SDK,则可能需要向csproj文件中添加代码,以指定要复制到发布目录的文件(或使用IDE更改将副本复制到输出"目录"设置,该设置还将文件包含在发布输出中,但也会将它们复制到构建输出中):
<ItemGroup> <None Update="*.json" CopyToPublishDirectory="PreserveNewest" /> </ItemGroup>
-
网络发布逻辑
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.*)的测试项目,它有些不同且棘手,请参阅
从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>
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:
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 awwwroot
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>
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之间有什么区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!