【问题标题】:Getting the right dependency version when using a .NET Standard library in .NET Framework在 .NET Framework 中使用 .NET Standard 库时获取正确的依赖项版本
【发布时间】:2020-05-10 04:54:31
【问题描述】:

考虑以下场景:

  1. 您的解决方案中有一个针对 netstandard20 的项目“X”。
  2. 项目 X 依赖于外部 nuget 包“ENP”,该包具有不同版本的 netstandard 和 netframework。当您将 ENP 添加到项目 X 时,您将获得 netstandard 版本。
  3. 您的解决方案中有一个面向 .NET Framework 4.7 的项目“Y”。这个项目引用了项目 X,因此也需要引用 ENP。但是,如果您将 ENP 作为 nuget 包添加到此项目中,您将获得 .NET Framework 版本而不是 .NET Standard 版本,并且您的应用程序将崩溃。

据我所知,没有办法强制 nuget 获得正确的版本。是手动添加正确引用的唯一解决方案吗?

现在,第二种情况:您想通过 nuget 包分发项目 X。当人们安装它时,他们也会自动安装依赖 ENP。您如何确保 nuget 获取正确的版本?你不能真的要求其他人手动添加正确的依赖...

对于项目 X 有多个构建目标是正确的解决方案吗?

【问题讨论】:

  • 除非项目 YENP 有直接依赖关系,否则不应包含 NuGet 引用 - 让 X为你做。否则,您描述的问题与 .NET 应用程序依赖于多个 DLL 和 3rd 方库的情况没有什么不同,其中两个恰好与不同版本的说 log4net 有显式绑定。
  • ...现在假设 Y 确实 对 ENP 有直接依赖关系,那么您描述的问题类似于我遇到的问题UWP 项目。解决方案首先在添加其他 NuGet 引用之前向所有项目添加对第 3 方 NuGet 包的显式引用(即使此库包含在我即将添加的其他 NuGet 包中)。这确保了我想要的版本被使用,而不是其他 NuGet 库决定它
  • Y 没有直接的依赖关系,但是“让 X 去做”什么都不做。编译时不会复制文件。
  • "...文件不会在编译时被复制..." - 嗯,这很不寻常
  • 为什么 Y 会因为它使用 .NET Framework 版本的程序集而不是 .NET Standard 而崩溃?对我来说,这听起来像是 ENP 没有很好地编写(不同 TFM 的程序集应该是 API 兼容的)。如果这超出了您的控制范围,那么您需要使 X 多目标 netstandard2.0 和 net47 并使用 #if NET47 #else 根据每个 TFM 的 TFM 和 ENP 的 API 在您自己的包中编译不同的代码。根据我的阅读,NuGet 正在按设计工作。

标签: c# .net visual-studio nuget .net-standard


【解决方案1】:

这个项目引用了项目 X,因此也需要 参考 ENP。

如果您的项目没有直接依赖 ENP,那么您的项目实际上不需要引用 ENP。就像上面 MickyDZivkan 评论的那样,nuget 正在按照您的方案中的设计工作。

对于你遇到Y does not have an immediate dependency, but "letting X do it" does nothing. The files aren't copied over on compile的行为,我想这可能是因为你当前的项目没有使用PackageReference格式。

有两种格式来管理 nuget 包,Package.configPackageReference。所有.net standard and .net core 项目都使用PackageReference 格式,而以.net framework 为目标的项目可以使用packages.configPackageReference 格式。如果您的 .net 框架项目选择 packages.config 来管理 nuget 包,构建后我们无法从 ENP 包中找到文件,导致当前项目和引用的 X 项目不使用相同的管理格式。为此,创建一个使用 packageReference 的新项目,或将其添加到当前项目的 (packages-config) 项目文件中:

  <PropertyGroup>
    <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
  </PropertyGroup>

确保此项目和引用的 X 项目使用相同的 PackageReference 格式,然后您会发现“让 X 做”可以满足您的需求。

我认为上面的脚本可以解决您的第一个问题,然后我们不需要继续您基于第一个问题的第二个场景。希望对你有帮助:)

【讨论】:

    猜你喜欢
    • 2020-09-19
    • 2011-03-14
    • 2019-11-03
    • 2020-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多