在paket.dependencies文件中,运算符`==`是什么意思?

时间:2019-06-20 14:11:58

标签: paket

在项目的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

运算符==的含义是什么?

2 个答案:

答案 0 :(得分:0)

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

要得出结论,==将覆盖给定版本的软件包,否则,将使用给定版本的当前软件包。请进行粗略的理解,并在旁边提供任何详尽的答案。

答案 1 :(得分:0)

这称为“使用完全使用此版本”约束。它确实应该是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

在这种情况下,购物袋将找不到适合A和B的通用C版本。

在某些项目中,我曾看到某些项目依赖于像A之类的软件包,该软件包声称它不适用于C版本> = 2.0的软件包。但是,在实际测试中,A可以在最高版本下正常工作因此,可以添加一行以强制paket覆盖A对C的版本约束:

nuget C == 2.0

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