在 paket.dependencies 文件中,运算符 `==` 的含义是什么?

In a paket.dependencies file, what is the meaning of the operator `==`?

在项目的 paket.dependencies 文件中,我发现了这些行:

nuget Microsoft.AspNet.Mvc == 5.2.6
nuget Microsoft.AspNet.Razor == 3.2.6
nuget Microsoft.AspNet.WebPages == 3.2.6

我检查了 official documentation 没有成功。 我的猜测是 == 可以修复版本号,但要实现这一点,我们可以直接编写 nuget Microsoft.AspNet.Mvc 5.2.6.

运算符==是什么意思?

Paket 是一个开源项目。让我们挖掘源头。 paket.dependencies 文件解析在 GitHub 上可用。逻辑如下:

match splitVersion text with
    | "==", version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.OverrideAll v,parsePrerelease [v] rest)
    | ">=", version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.Minimum v,parsePrerelease [v] rest)
    | ">", version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.GreaterThan v,parsePrerelease [v] rest)
    | "<", version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.LessThan v,parsePrerelease [v] rest)
    | "<=", version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.Maximum v,parsePrerelease [v] rest)
    | "~>", minimum :: rest -> 
        let v1 = SemVer.Parse minimum
        VersionRequirement(VersionRange.Between(minimum,twiddle v1),parsePrerelease [v1] rest)
    | _, version :: rest -> 
        let v = SemVer.Parse version
        VersionRequirement(VersionRange.Specific v,parsePrerelease [v] rest)
| _ -> failwithf "could not parse version range \"%s\"" text

source

因此 == 会将 VersionRange 设置为 OverrideAll。这将对 IsGlobalOverride.

产生影响
member x.IsGlobalOverride =
    match x with
   | OverrideAll _ -> true
   | _ -> false

source

总结 == 将覆盖给定版本的包,如果没有,将使用给定版本的当前包。这是一个粗略的理解,请在旁边进行任何彻底的回答。

它被称为 "Use exactly this version" 约束。它确实应该是 paket.dependencies 参考的一部分,但它位于:https://fsprojects.github.io/Paket/nuget-dependencies.html

我会试着用一个例子来解释它。假设您依赖包 A 和 B。

A 和 B 都依赖于 C,但在它们各自的 nuget 包依赖声明中指定:

A 依赖于 C 版本 >= 1.2.3 但 < 2.0

B 依赖 C 版本 >= 2.0

在这种情况下,paket 将无法找到适合 A 和 B 的通用 C 版本。

我在一些项目中看到过这样的情况,其中对像 A 这样的包有依赖性,声称它不能与包 C 的 >= 2.0 版本一起使用。但是在实际测试时,A 与C 的最高版本。因此可以添加一行强制 paket 覆盖 A 对 C 的版本约束:

nuget C == 2.0

当然,长期的解决方案是要求 A 的维护者更新他们的 nuget 依赖声明。