【问题标题】:Manage nuget packages with PackageReferences when .Net Framework+Standard+Core combined.Net Framework+Standard+Core 组合时使用 PackageReferences 管理 nuget 包
【发布时间】:2018-12-28 17:54:24
【问题描述】:

问题:

如何在具有 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>
  • 这是否意味着通常我需要为每个框架/标准/核心至少 3 个 PackageReferences
  • 遇到.Net Framework 4.6时如何管理版本?
  • 由于 nuget 版本兼容性问题,当我无法运行引用 .net standard lib 的控制台 .net core 应用程序时,我也遇到了这个问题。

另外,我想提一下,我看到几篇文章说.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 个分支(FWKCore)使用的基类(standard)。 代码中不需要多目标或指令(条件编译)。 暗示应该通过复制粘贴和修改从头开始创建新的解决方案。 仍然不能 100% 确定这个决定的合理性。

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


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

【问题讨论】:

  • 当您卡在 .NET Framework 4.6 上时,请务必为 net46netstandard20 创建一个多目标核心库。定位netstandard13 是没有意义的,因为那里的API 非常有限,而且您不需要支持像WP 或Silverlight 这样的旧平台。用PackageReference 做你的实验,你甚至不需要问第一个问题。 “由于 nuget 版本兼容性问题,当我无法运行引用 .net 标准库的控制台 .net 核心应用程序时,我也遇到了这个问题”究竟是什么问题?
  • @LexLi 这不是“毫无意义的”——除非您积极尝试针对一些低级框架,例如 windows phone,否则它通常没有用处
  • @LexLi,非常感谢!做多目标可能是个好主意。至于版本兼容性问题:我无法在 vs17 中运行引用 netstandard1.3 库的 netcore1.0 控制台应用程序(请参阅下一条评论)。谢谢!
  • @LexLi,输出:程序“[12780] dotnet.exe”已退出,代码为 -2147450751 (0x80008081)。程序“[1996] iisexpress.exe”已退出,代码为 0 (0x0)。

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


【解决方案1】:

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

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

如果您引用的东西存在并针对与您的项目相同的平台,它应该正常工作。但是,除非您实际上在 Framework、Standard 和 Core 中做一些不同的,否则您不妨只针对 Standard,实际上:许多库现在至少基于 netstandard2.0。这对您来说可能会也可能不会。

版本在 4.6 上没有任何不同,除非特定软件包存在问题,但是:您可以通过在 &lt;ItemGroup&gt; 或特定 &lt;PackageReference&gt; 元素上使用 Condition 属性来解决这个问题。例如,我有一个针对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 目标将列出依赖项。我还可以列出每个目标框架完全不同的依赖项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2018-07-06
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多