我有一个包含两个主机项目的解决方案(一个是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.Sdk
和Microsoft.NETCore.App
)而不是ASP.NET Core(Microsoft.NET.Sdk.Web
和Microsoft.AspNetCore.App
),因为它不是一个Web项目吗?
2)在类库项目中,可以使用Microsoft.NET.Sdk
和Microsoft.AspNetCore.App
来避免引用属于Microsoft.AspNetCore.App
的不同版本的包的可能性(例如,避免在主题项目中使用[email protected]
,在类库项目中使用[email protected]
)?或者我只能使用Microsoft.AspNetCore.App
metapackage与Microsoft.NET.Sdk.Web
SDK?
3)使用Microsoft.NET.Sdk
或Microsoft.NET.Sdk.Web
有什么不同? docs说“SDK,正如分层文档描述的那样,是一组可以构建.NET核心代码的MSBuild任务和目标。”,但为什么我们需要同时拥有它们?在实践中,Microsoft.NET.Sdk.Web
做什么Microsoft.NET.Sdk
没有?
广告(1)和(3):“核心”和网络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>
.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>