Nuget图书馆的多运行时目标定位

Tro*_*ald 2 .net c# nuget .net-core .net-standard

我有一个目前使用.NET 4.0构建并部署到Nuget的库.该库没有很多依赖项,似乎在.NET Standard和Core项目中也能很好地工作.

手动添加到标准或核心项目时,库会引发兼容性错误.通过修改.csproj文件以删除不需要的引用来解决此问题.它现在看起来像这样.

<ItemGroup>
   <Reference Include="System" />
   <Reference Include="System.Core" />
   <Reference Include="Microsoft.CSharp" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

这似乎解决方案似乎使核心和标准的库功能正确.当手动将库添加到Standard或Core项目时,兼容性警告现在已经消失,即使该库仍使用.NET 4.0构建.但是,在发布到Nuget,然后通过Nuget下载库后,我仍然收到此警告.

"警告****包'******'使用'.NETFramework,Version = v4.6.1'而不是项目目标框架'.NETCoreApp,Version = v2.0'恢复.此包可能不是与您的项目完全兼容."

在经历了很多烦恼和调查之后,我意识到该库似乎仍然适用于标准和核心项目,但我不确定它是否使用.NET 4.6.1来实际运行基于此警告的库.

所以我的问题是,如何正确地将程序包部署到Nuget以正确定位多个运行时?我是否需要在每个运行时中构建多个项目?如果是这样,我可以将其打包为一个包仍然,或者我是否需要为每个运行时使用不同的版本?不确定这里的最佳做法是什么.

Mar*_*ell 5

最简单的方法是更改​​csproj以使用新的SDK格式,并使用<TargetFrameworks>.例如,这里是Dapper的项目文件,它为3个TFM构建 - 关键是:

<TargetFrameworks>net451;netstandard1.3;netstandard2.0</TargetFrameworks>
Run Code Online (Sandbox Code Playgroud)

加之通过一些决定Condition是影响其包装或装配引用添加每个TFM属性-你可以看到这些条件的结果,在"相关性"观点上的NuGet 这里.当您dotnet pack -c Release在IDE中使用"在构建时生成NuGet包"选项(包选项卡,项目属性)构建IDE时,它将.nupkg在构建输出中为您生成,它将在内部包含3个TFM.