1

问题:

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

  • .Net 标准 1.3
  • .Net 框架 4.6
  • .Net 核心 1.0

?

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

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

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


语境:

我不是以英语为母语的人,而且我对非平凡的 nuget 用法和.Net Core/Standard开发非常陌生。

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

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

但是问题意味着要采取这种方法:Framework++ 。StandardCore


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

4

1 回答 1

3

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

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

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

除非特定软件包存在问题,否则版本在 4.6 上的工作方式没有任何不同,但是:您可以通过在特定元素上使用Condition属性来解决这个问题。例如,我有一个以和为目标的库;碰巧的是,我使用的所有东西都已经内置在 net461中,所以为了避免任何下游依赖,我可以这样做:<ItemGroup><PackageReference>net461netstandard2.0

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

于 2018-07-20T12:17:06.783 回答