【问题标题】:NuGet does not copy dependencies with higher version than the one specifiedNuGet 不会复制版本高于指定版本的依赖项
【发布时间】: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 没有复制到 Wbin 文件夹中。 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 只是安装包,因为如果 N2N1 所需的确切最低版本,那么 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


【解决方案1】:

我无法使用针对 4.5 的 VS 2012 重现此问题,这是我尝试过的
1.新建Web应用项目
2.新建类库
3. 添加从 Web 应用程序到类库的引用
4.在类库中 PM> 安装包 windowsAzure.servicebus

正在尝试解决依赖项“Microsoft.WindowsAzure.ConfigurationManager (≥ 1.7.0.0)”。 您正在从 Microsoft 下载 Microsoft.WindowsAzure.ConfigurationManager,其许可协议位于 http://go.microsoft.com/fwlink/?LinkID=235167。检查软件包是否有其他依赖项,这些依赖项可能附带他们自己的许可协议。您对包和依赖项的使用构成您接受他们的许可协议。如果您不接受许可协议,请从您的设备中删除相关组件。

成功安装“Microsoft.WindowsAzure.ConfigurationManager 1.7.0.3”。 您正在从 Microsoft 下载 WindowsAzure.ServiceBus,其许可协议位于 http://go.microsoft.com/fwlink/?LinkId=218949。检查软件包是否有其他依赖项,这些依赖项可能附带他们自己的许可协议。您对包和依赖项的使用构成您接受他们的许可协议。如果您不接受许可协议,请从您的设备中删除相关组件。 成功安装“WindowsAzure.ServiceBus 1.8.0.0”。

已成功将“Microsoft.WindowsAzure.ConfigurationManager 1.7.0.3”添加到 ClassLibrary1。
已成功将“WindowsAzure.ServiceBus 1.8.0.0”添加到 ClassLibrary1。
5. 服务总线依赖于 >=1.7 的配置并且安装了 1.8 版本的配置管理
6.构建类库然后webapplication解决方案,刷新解决方案资源管理器。对于我的解决方案,我看到类库、服务总线和配置管理器都放在 bin 文件夹中。 (不知道为什么,但我在添加引用后再次尝试构建类库后看到文件丢失了)

这里有什么我遗漏的吗?

【讨论】:

  • 我按照您提到的确切步骤进行操作,Microsoft.WindowsAzure.ConfigurationManagerWindowsAzure.ServiceBus 均未复制到 WebApplication bin 文件夹.您的 NuGet 输出表明您将包安装到 WebApplication 而不是 ClassLibrary(“已成功将 'Microsoft.WindowsAzure.ConfigurationManager 1.8.0.0' 添加到 WebApplication15”)。你能再试一次并告诉我吗?
  • 是的,你是对的,我错过了从包管理控制台选择要安装的项目。我认为这与connect.microsoft.com/VisualStudio/feedback/details/586875/… 相同。您的目标是 4.5 吗?
  • 我已经上传了我的项目,它似乎在这里工作dropbox.com/s/3r3pgpwx8p5vwwq/WebApplication1.zip?m(我必须清理 bin 文件夹,然后先构建类库,然后再构建 webapplication。检查磁盘或刷新解决方案资源管理器以查看服务总线和配置管理器放在 webapplication bin 文件夹中)。你能分享你的项目吗,我可以试一试。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
相关资源
最近更新 更多