版本控制参考
通过版本控制,可以从清单文件中确定性地控制项目使用的依赖项的精确修订。 版本控制仅适用于 清单模式 用户。
有关 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.json
、portfile.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" }
]
}