【发布时间】:2020-05-10 04:54:31
【问题描述】:
考虑以下场景:
- 您的解决方案中有一个针对 netstandard20 的项目“X”。
- 项目 X 依赖于外部 nuget 包“ENP”,该包具有不同版本的 netstandard 和 netframework。当您将 ENP 添加到项目 X 时,您将获得 netstandard 版本。
- 您的解决方案中有一个面向 .NET Framework 4.7 的项目“Y”。这个项目引用了项目 X,因此也需要引用 ENP。但是,如果您将 ENP 作为 nuget 包添加到此项目中,您将获得 .NET Framework 版本而不是 .NET Standard 版本,并且您的应用程序将崩溃。
据我所知,没有办法强制 nuget 获得正确的版本。是手动添加正确引用的唯一解决方案吗?
现在,第二种情况:您想通过 nuget 包分发项目 X。当人们安装它时,他们也会自动安装依赖 ENP。您如何确保 nuget 获取正确的版本?你不能真的要求其他人手动添加正确的依赖...
对于项目 X 有多个构建目标是正确的解决方案吗?
【问题讨论】:
-
除非项目 Y 对 ENP 有直接依赖关系,否则不应包含 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