当.Net Framework + Standard + Core组合在一起时,使用PackageReferences管理nuget软件包

时间:2018-07-20 12:07:56

标签: .net .net-core nuget .net-standard packagereference

问题:

如何在具有3个平台的VisualStudio2017解决方案中管理nuget软件包:

  • .Net Standard 1.3
  • .Net Framework 4.6
  • .Net Core 1.0

我喜欢PackageReference方法,但是我不知道如何使用它。他们谈论:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
    <!-- ... -->
</ItemGroup>
  • 这是否意味着对于每个Framework / Standard / Core,我通常至少需要3个 PackageReferences
  • 当我们陷入.Net Framework 4.6时如何管理版本?
  • 由于 nuget 版本兼容性问题,当我无法运行引用.net core lib的控制台.net standard应用时,我也遇到了这个问题。

此外,我想提到我遇到了几篇文章,这些文章指出.csproj又回来了,不需要使用.xprojproject.json。就个人而言,我喜欢这种想法来像以前一样处理.csproj


上下文:

我不是讲英语的人,并且对非琐碎的nuget用法和.Net Core / Standard开发非常陌生。

我正准备将.Net Framework应用程序移植到.Net Framework + Standard + Core。 现在,这只是一个 WPF 应用程序。但是在将来,它打算保留相同的 WPF 应用程序,但还要从现有逻辑中继承一个新的.Net Core分支。 我不确定确切的新.Net Core分支的计划是什么。最有可能的计划是创建一个ASP.Net Core网站。 我可以确定的是,任务是保持逻辑以.Net Framework(使用 WPF UI)运行,并将其实现为.Net Core

由于简单,我决定使用Framework + Standard + Core的组合作为解决方案。我的意思是这个概念很容易理解:2个分支( FWK Core )使用的基类( standard )。 在代码中不需要多目标或指令(条件编译)。 暗示应通过复制粘贴和修改从头创建新解决方案。 仍不能100%确信此决定的合理性。

但是这个问题暗示着应该采用这种方法:Framework + Standard + Core


我希望这个问题是合理的;我的意思是,在这种情况下,对nuget软件包的有效管理是成功进行跨平台项目的良好起点。谢谢!

1 个答案:

答案 0 :(得分:3)

注意:我假设您在这里使用新的SDK csproj格式,例如:

<TargetFrameworks>netstandard1.3;net46;netcoreap1.0</TargetFrameworks>

如果您所引用的事物与项目一样都存在并定位到目标,那么它应该正常工作。但是,除非您实际上在Framework vs Standard vs Core中做了一些不同的事情,否则您最好只针对Standard,实际上:许多库现在至少以netstandard2.0为基础。这可能对您来说可能或不可能。

版本在4.6上没有任何区别,除非特定的软件包存在问题,但是:您可以通过在Condition或特定的{{1}上使用<ItemGroup>属性来解决此问题}元素。例如,我有一个针对<PackageReference>net461的库;碰巧的是,我正在使用的所有都已内置到net461 中,因此为了避免任何下游依赖性,我可以这样做:

netstandard2.0

这给了我(很生气)

enter image description here

但是我本可以将所有内容都保留为:

  <ItemGroup Condition="'$(TargetFramework)'=='net461'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup Condition="'$(TargetFramework)'!='net461'">
    <PackageReference Include="System.Data.Common" Version="4.3.0" />
    <PackageReference Include="System.Reflection" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
    <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
    <PackageReference Include="System.Security.Permissions" Version="4.5.0" />
  </ItemGroup>

,它将正常工作-只是: <ItemGroup> <PackageReference Include="System.Data.Common" Version="4.3.0" /> <PackageReference Include="System.Reflection" Version="4.3.0" /> <PackageReference Include="System.Reflection.Emit" Version="4.3.0" /> <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" /> <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" /> <PackageReference Include="Microsoft.CSharp" Version="4.5.0" /> <PackageReference Include="System.Security.Permissions" Version="4.5.0" /> </ItemGroup> 目标将列出依赖项。我还可以列出每个目标框架完全不同的依赖项。