【发布时间】:2012-11-27 22:05:14
【问题描述】:
我有一个 Web 项目 (W),它引用了一个类库项目 (C):
W --> C
C 引用 N1:
C --> N1
N1 是一个自定义 NuGet 包,它有两个依赖项(都是自定义 NuGet 包):N2 e N3,针对版本 2.1或更高和 3.4 或更高。
N1 ---> N2 (>= 2.1)
`--> N3 (>= 3.4)
当我将 N1 包添加到 C 时,N2 有一个可用的 2.2 版本,所以 NuGet 得到了那个,而不是 2.1,正如预期的那样。
问题从这里开始:当我构建 W 时,N2 没有复制到 W 的 bin 文件夹中。 google了一下,发现Visual Studio并没有把不是“第一类依赖”的依赖,也就是C不直接使用的依赖复制到W 的输出文件夹。我可以确认,因为当我将下面的方法添加到 C 中的任何类时,N2 会被复制。
private void ForceCopyOfN2()
{
var someObject = new N2.SomeClass();
}
此外,如果没有上述 hack,如果我将 N2 的版本降级到 与 N1 包依赖项指定的相同 版本(即从 2.2 到 2.1),N2 也会被复制。
所以我猜这是 NuGet 的问题。有没有人经历过这样的事情?
【问题讨论】:
-
嗨,Alex,这可能不是 NuGet,因为在您的类库项目中安装了包之后,它的工作就结束了。这些是哪些包?谢谢,克莱
-
@ClayCompton,正如我所说,这些是自定义 NuGet 包,托管在自定义 NuGet 服务器上。我很难相信 NuGet 只是安装包,因为如果 N2 是 N1 所需的确切最低版本,那么 N2 会被复制到W 的输出目录。还有谁可以做这个副本?
-
我怀疑这与 msbuild 如何解决依赖关系有关。重新编译并为每个条件 (N1v2.1) 和 (N1v2.2) 打开详细的构建输出,并比较构建输出结果。
-
@JayWalker,使用详细的构建输出进行编译肯定会带来一些东西。我得出的结论是:当C编译时,它试图找到N2 2.1,因为这是N1需要的版本。它找不到它,但 N2 2.2 是 C 的直接引用(因为 NuGet 依赖),所以在发生冲突后它说“选择 N2-2.2 是因为它是主要的,而 N2-2.1 不是”。然而当W编译时,它也试图找到N2 2.1但没有成功,但是没有N2 2.2直接引用,所以它没有复制任何东西。我有点卡在这里。
标签: msbuild visual-studio-2012 nuget