【问题标题】:Why does NuGet resolve versions differently depending on where you start?为什么 NuGet 解析版本取决于您从哪里开始?
【发布时间】:2014-02-24 08:53:19
【问题描述】:

我打包为 NuGet 包的库使用 await/async,因此我需要向 Microsoft.Bcl.Async 添加依赖项。但是 Microsoft.Bcl.Async 依赖于 Microsoft.Bcl 和 Microsoft.Bcl.Build。根据安装顺序,我从 NuGet.org 获得这些包的不同版本的测试项目中会发生什么。

如果我安装 Microsoft.Bcl.Async,则 NuGet 会安装以下包:

package id="Microsoft.Bcl.Build" version="1.0.4" 
package id="Microsoft.Bcl" version="1.0.19"  
package id="Microsoft.Bcl.Async" version="1.0.165" 

然后我的测试项目没有编译。

如果我首先安装 Microsoft.Bcl,NuGet 会安装以下内容:

package id="Microsoft.Bcl.Build" version="1.0.10" 
package id="Microsoft.Bcl" version="1.1.6" 

然后我可以安装 Microsoft.Bcl.Async:

package id="Microsoft.Bcl.Async" version="1.0.165" 

测试项目没有编译。

但如果我一个一个手动安装所有三个 BCL 项目,我会得到以下结果:

package id="Microsoft.Bcl.Build" version="1.0.13" 
package id="Microsoft.Bcl" version="1.1.6" 
package id="Microsoft.Bcl.Async" version="1.0.165" 

只有这样我的测试项目才能编译成功!

我一定误解了 NuGet 版本解析的工作原理,但 NuGet 不应该将包解析为兼容性范围内的最新版本吗?上面的场景显示,NuGet 获取支持数量最小的依赖版本:Microsoft.Bcl.Async 1.0.165 需要 Microsoft.Bcl 1.0.19 或更高版本,NuGet 需要 1.0.19。 Microsoft.Bcl 1.0.19 需要 Microsoft.Bcl.Build 1.0.4 或更高版本,NuGet 需要 1.0.4。最后它是最旧的兼容包的组合(显然它不能正常工作)。

如果这是默认行为,是否可以覆盖它?

【问题讨论】:

    标签: .net dependencies nuget versioning nuget-package


    【解决方案1】:

    NuGet 不应该将包解析为兼容性范围内的最新版本吗?

    没有。 NuGet will actually choose the lowest major/minor version and the highest patch version。这样做的理由是,主要版本可以引入重大更改,次要版本可以引入新功能(因此引入错误的可能性更高),但补丁版本只能修复错误。

    如果这是默认行为,那么是否可以覆盖它?

    由于您的库需要这些库的特定版本,因此只需将add a version attribute 连接到您的 nuspec 中的相应 dependency 节点即可。

    【讨论】:

    • 啊,这是由于 Microsoft.Bcl 的次要版本不同。我懂了。我已在 Nuspec 文件中明确指定它,现在一切都已正确解决。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多