版本控制参考

通过版本控制,可以从清单文件中确定性地控制项目使用的依赖项的精确修订。 版本控制仅适用于 清单模式 用户。

有关 vcpkg 版本控制算法和高级概念的详细信息,请参阅 版本控制概念

有关上下文的示例,请参阅我们的指南,了解如何 版本控制入门。

版本方案

vcpkg 中的端口应尝试遵循包的作者使用的版本控制约定。 因此,在声明包的版本时,应使用适当的方案。

每个版本控制方案定义其自己的规则,即什么是有效的版本字符串,更重要的是,有关如何使用相同的方案对版本进行排序的规则。

vcpkg 理解的版本控制方案包括:

Manifest 属性 版本控制方案
version 对于点分隔的数值版本
version-semver 对于符合 SemVer 的版本
version-date 对于格式为 YYYY-MM-DD 的日期
version-string 对于任意字符串

清单必须仅包含一个版本声明。

注意

根据设计,vcpkg 不会比较使用不同方案的版本。 例如,具有 version-string: 7.1.3 的包不能与使用 version: 7.1.4的同一包进行比较,即使转换似乎很明显。

version

接受遵循宽松的点分隔的类似 semver 的方案的版本字符串。

版本在逻辑上由点分隔(.)数值部分组成。 每个节必须包含一个整数正数,且没有前导零。

此版本控制方案的正则表达式模式为:(0|[1-9]\d*)(\.(0|[1-9]\d*))*

排序行为:比较两个版本时,每个部分按数值从左到右进行比较,直到找到第一个差异。 一个具有最小节集的版本优先于另一个版本,其中包含一组较大的节,因为上述所有部分的比较均等。

例:

0 < 0.1 < 0.1.0 < 1 < 1.0.0 < 1.0.1 < 1.1< 2.0.0

version-semver

接受遵循语义版本控制约定的版本字符串,如 语义版本控制规范中所述。

排序行为:字符串按照语义版本控制规范中所述的规则进行排序。

例:

1.0.0-1 < 1.0.0-alpha < 1.0.0-beta < 1.0.0 < 1.0.1 < 1.1.0

version-date

接受可在 ISO-8601 格式 YYYY-MM-DD之后分析到日期的版本字符串。 允许消除歧义标识符采用点分隔、正整数和无前导零的形式。

这是未建立发布版本的“在 HEAD 上实时”库的建议版本控制方案。

此版本控制方案的正则表达式模式为:\d{4}-\d{2}-\d{2}(\.(0|[1-9]\d*))*

排序行为:字符串首先按日期部分进行排序,然后通过消除歧义标识符的数字比较进行排序。 消除歧义标识符遵循宽松(version)方案的规则。

示例:2021-01-01<2021-01-01.1<2021-02-01.1.2<2021-02-01.1.3<2021-02-01

version-string

对于使用不符合任何其他方案的版本字符串的包,它接受大多数任意字符串。 不允许用于表示端口版本的 #

排序行为:不会尝试对版本字符串本身进行排序。 但是,如果字符串完全匹配,则可以比较和排序其端口版本。

例子:

  • apple <> orange <> orange.2 <> orange2
  • watermelon#0< watermelon#1

port-version

端口版本跟踪打包文件(vcpkg.jsonportfile.cmake等)中的更改,而无需对上游库版本进行任何更改。

端口版本是非负整数值。

端口版本的规则包括:

  • 对于端口的原始版本,从 0 开始,
  • 每次对不增加包版本的端口进行特定于 vcpkg 的更改时增加 1,
  • 并在每次更新包版本时重置为 0。

注意

vcpkg 遵循文本格式 <version>#<port version>。 例如,1.2.0#2 表示版本 1.2.0 端口版本 2。 如果端口版本 0 省略 #0 后缀(例如,1.2.0 表示版本 1.2.0 端口版本 0)。

排序行为:如果两个版本相等比较,则其端口版本由其数值进行比较,则较低端口版本优先。

例子:

  • 1.2.0 < 1.2.0#1 < 1.2.0#2 < 1.2.0#10
  • 2021-01-01#20 < 2021-01-01.1
  • windows#7 < windows#8

版本约束

基线

基线定义将考虑哪些版本的全局版本(除非在其他地方指定,否则将使用与该基线关联的版本)。 这使顶级清单能够保持整个依赖项关系图 up-to日期,而无需单独指定直接 "version>=" 约束。

每个配置的注册表都有关联的基线。 对于未配置任何注册表的清单,"builtin-baseline" 字段定义内置注册表的基线。 如果清单未配置任何注册表且没有 "builtin-baseline",则安装会根据经典模式算法运行,并忽略所有版本控制信息。

基线与其他注册表设置一样,会从用作依赖项的端口中忽略。 如果在传递版本解析期间需要最低版本,则端口应使用 "version>="

{
  "name": "project",
  "version": "1.0.0",
  "dependencies": ["zlib", "fmt"],
  "builtin-baseline":"9fd3bd594f41afb8747e20f6ac9619f26f333cbe"
}

若要添加初始 "builtin-baseline",请使用 vcpkg x-update-baseline --add-initial-baseline。 若要更新清单中的基线,请使用 vcpkg x-update-baseline

version>=

表示最低版本要求,version>= 声明对可用于满足依赖项的版本施加较低边界。

注意

vcpkg 选择与所有约束匹配的最低版本,因此不需要小于约束。

例:

{
  "name": "project",
  "version-semver": "1.0.0",
  "dependencies": [
    { "name": "zlib", "version>=": "1.2.11#9" },
    { "name": "fmt", "version>=": "7.1.3#1" }
  ],
  "builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc"
}

作为版本约束声明的一部分,可以通过添加后缀 #<port-version>来指定端口版本,1.2.11#9 引用版本 1.2.11 端口版本 9

overrides

声明替代会强制 vcpkg 忽略所有其他版本约束,并使用替代中指定的版本。 这对于固定确切版本和解决版本冲突非常有用。

替代声明为包版本声明的数组。

要使重写生效,重写的包必须构成依赖项图的一部分。 这意味着,依赖项必须由顶级清单声明,或者是可传递依赖项的一部分。

只能为给定名称声明一个替代。

{
  "name": "project",
  "version-semver": "1.0.0",
  "dependencies": [
    "curl",
    { "name": "zlib", "version>=": "1.2.11#9" },
    "fmt"
  ],
  "builtin-baseline":"3426db05b996481ca31e95fff3734cf23e0f51bc",
  "overrides": [
    { "name": "fmt", "version": "6.0.0" },
    { "name": "openssl", "version": "1.1.1h#3" }
  ]
}