当.Net Framework + Standard + Core结合使用时,使用PackageReferences管理nuget包

问题描述 投票:1回答:1

题:

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

  • .Net标准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应用程序时遇到了问题。

另外,我想提一下,我发现了一些文章,声称.csprojs回来了,并且不需要.xprojproject.json。就个人而言,我喜欢这个想法像以前一样处理.csprojs。


语境:

我不是母语为英语的人,我对非平凡的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个brances使用的基类(标准)(FWK,Core)。代码中不需要mutitargeting或指令(条件编译)。暗示应该通过复制粘贴和修改从头开始创建新解决方案。仍然不是100%肯定这个决定的合理性。

但这个问题意味着要采取这种方法:Framework + Standard + Core


我希望这个问题是合理的;我的意思是在这种情况下有效管理nuget包是一个成功的跨平台项目的良好开端。谢谢!

.net .net-core nuget .net-standard packagereference
1个回答
3
投票

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

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

如果您引用的东西存在并且与项目的目标平台相同,那么它应该可以正常工作。但是,除非你实际上在Framework与Standard vs Core中做了一些不同的事情,否则你可能只是针对Standard,而实际上:许多libs现在以netstandard2.0作为最小值。这对您来说可能是也可能是不可能的。

版本在4.6上没有任何不同,除非特定包有问题,但是:你可以通过在Condition或特定的<ItemGroup>元素上使用<PackageReference>属性来解决这个问题。例如,我有一个针对net461netstandard2.0的库;并且当它发生时,我正在使用的所有东西都已内置到net461中,所以为了避免任何下游依赖,我可以这样做:

  <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>

这给了我(在nuget中):

enter image description here

然而;我本可以把一切都留下来:

  <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>

它会工作得很好 - 只是:net461目标将列出依赖关系。我还可以为每个目标框架列出完全不同的依赖项。

© www.soinside.com 2019 - 2024. All rights reserved.