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

Manage nuget packages with PackageReferences when .Net Framework+Standard+Core combined

问题:

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

?

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

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
    <!-- ... -->
</ItemGroup>

此外,我想提一下,我看到几篇文章说 .csproj 回来了,不需要 .xprojproject.json。就个人而言,我喜欢这个想法来像以前一样处理 .csprojs。


上下文:

我的母语不是英语,我对重要的 nuget 用法和 .Net Core/Standard 开发非常陌生。

我正准备将 .Net Framework 应用程序移植到 .Net Framework+Standard+Core。 这现在只是一个 WPF 应用程序。但在未来,它打算保持相同的 WPF 应用程序,但也有一个新的 .Net Core b运行ch,从现有逻辑中提升。 我不确切知道可能的新 .Net Core b运行ch 的计划是什么。最有可能的是,计划是创建一个 ASP.Net Core 网站。 我确切知道的是,任务是保持逻辑 运行ning 为 .Net Framework(使用 WPF UI)并将其实现为.Net Core.

我决定使用 Framework+Standard+Core 的组合作为解决方案,因为它很简单。我的意思是这个概念很容易理解:base 类 (standard) used by 2 b运行ces (FWK, 核心)。 代码中不需要多目标或指令(条件编译)。 这意味着新的解决方案应该通过复制粘贴和修改从头开始创建。 仍然不能 100% 确定这个决定的合理性。

但问题暗示要采用这种方法:Framework+Standard+Core.


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

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

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

如果您引用的东西 存在并且目标 所有与您的项目相同的平台,它应该 正常工作 。但是,除非您实际上在 Framework vs Standard vs Core 中做 不同的事情 ,否则您最好只针对 Standard,而实际上:许多库现在都在变基 netstandard2.0作为最低限度。这对您来说可能可行,也可能不可行。

版本在 4.6 上没有任何不同,除非特定包有问题,但是:您可以通过在 <ItemGroup> 或特定 [=] 上使用 Condition 属性来解决这个问题16=] 元素。例如,我有一个针对 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 中):

但是;我本可以保留一切:

  <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 目标会列出依赖项。我也可以列出每个目标框架完全不同的依赖项。