内容源中的Refname匹配

Antora的核心是收集存储在各个git存储库中的引用中的内容。Playbook提供了几个键来指示Antora考虑哪些引用名称(即refnames),包括分支、标签和工作树,以及要扫描的这些引用中的起始路径。配置此过滤器的一种方法是逐个列出每个refname。然而,由于内容通常移动得非常快,这种方法可能会很繁琐和静态。这就是为什么Antora提供了一种批量包含和排除refnames的功能,使用模式匹配。模式匹配方法的好处在于简化了配置,并在新的refnames可用时自动发现它们。

本页描述了您可以用于匹配内容源中的refnames的值类型和语法。

值类型

本页涵盖的键接受两种值:

  • 字符串(即字符序列)

  • 字符串数组

字符串值将被拆分为逗号,最好后跟空格,如果存在的话。例如,字符串v1.0.x, v2.0.x将变成一个包含两个字符串v1.0.xv2.0.x的数组。

通常最好将字符串值用单引号括起来,以避免值中的字符与YAML(或您选择的配置语言)中的特殊语法发生冲突。

如果您使用模式匹配来匹配refnames,我们强烈建议您使用数组语法。单个或逗号分隔的字符串语法仅用于精确匹配。否则,您可能会得到意外的行为。

精确匹配

匹配refnames的最简单方法是将它们指定为精确名称。例如,您可以如下匹配名为main的单个分支:

branches: main

如果您还想为旧版本的发布线添加分支名称,可以用逗号分隔它们:

branches: v1.0.x, v2.0.x, main

您还可以将值表示为数组以明确说明:

branches: [v1.0.x, v2.0.x, main]

当我们说“精确匹配”时,我们指的是与引用的shortname匹配。例如,您不是匹配remotes/origin/v1.0.x或heads/v1.0.x,而是v1.0.x。这样做的原因是Antora会查找远程和本地引用,优先选择本地引用,并且每个唯一shortname只选择一个。

虽然看起来精确匹配是一个字面值,但实际上它是一个模式。模式总是从refname的开头匹配到结尾。但是,大多数refnames不包含在模式匹配语法中具有意义的任何字符(甚至不包括.)。因此,它就像一个寻找完全匹配的refname的字面值。但是,如果发现它没有匹配您期望匹配的refname,请记住它实际上是一个模式。

通配符(基本通配符)

在playbook中维护一系列精确refnames可能会很繁琐和混乱。这就是为什么Antora允许您使用模式匹配来批量匹配refnames。

最基本的模式匹配工具是通配符(*)。使用此模式通常被称为globbing,因为您使用它来捕获一组项目。

您可以使用单个通配符来匹配所有存在的refnames:

branches: '*'

但是很少有您会想要这样做。假设,相反,我们想匹配所有以v开头的refnames。我们可以通过在字母后面放置一个星号来实现这一点。

branches: v*

*表示“任意数量的字符”。在这种情况下,它匹配在重命名开头跟随v的任意数量的字符。

您还可以在字符串的两个部分之间使用通配符来匹配两部分之间的任意数量的字符。让我们使用它来更精确地匹配版本号。

branches: v*.*.x

此模式将匹配v1.0.xv2.0.x甚至v20.10.x。但是,只有当refnames本身只包含数字时,它才会匹配数字。这意味着它也可以匹配very.last.x。当我们进入更高级的模式时,我们将能够解决这个问题,但这也带来了过度匹配的问题和排除的需求。

排除

到目前为止,我们已经讨论了我们想要匹配的refnames,或者说是包含。当您开始使用模式时,您可能会遇到匹配太多项的问题。您可以使用一个或多个排除项从先前匹配的项中减去。排除条目始终以!开头。

假设您想匹配所有类似版本的refnames,但要排除在您开始使用Antora之前的版本。

branches: [v*.*.x, '!v1.0.x']

请注意,我们已经将值更改为数组语法,如建议。还有必要将排除项用单引号括起来,以免混淆YAML解析器。如果有疑问,请将字符串值用单引号括起来。这样做永远不会有坏处。

让我们丢弃我们无意中匹配的非版本refname:

branches: [v*.*.x, '!v1.0.x', '!very.last.x']

您还可以在排除模式中使用通配符来批量匹配您已经匹配的内容并删除这些匹配项。

branches: [v*.*.x, '!v1.*.x', '!very.last.x']

通配符是一个有用的工具,但它对匹配的字符非常宽松。您可能会发现需要更精确。这就是大括号的用武之地。

大括号

大括号,也称为大括号表达式,是用花括号({})括起来的模式。Antora支持三种类型的大括号表达式:

  • 逗号分隔的备用字符序列

  • 字母或数字范围

  • 带有步长的数字范围

交替

逗号分隔的备用字符列表,例如{this,that}应该被理解为“this或that”。这对于匹配版本中的特定数字非常有用。假设我们只想匹配一组非常有限的主要版本引用名称。我们可以使用交替大括号表达式来识别它们:

branches: v{5,6}.*.x

这个表达式将匹配v5.0.xv5.1.xv6.0.x

您可以使用交替表达式来匹配字符或段的缺失,使用空条目。让我们考虑使前缀v变为可选的情况。

branches: '{,v}{5,6}.*.x'

您还可以在交替条目中使用通配符。例如,我们可能希望以这种方式匹配预发布版本:

branches: '{,v}{5,6}.*.x{,-*}'

让我们考虑另一种情况,匹配给定主要版本引用名称的特定次要版本:

branches: v5.{7,8}.x

还可以匹配不以v(或其他前导字符)开头的引用名称。

branches: 5.{7,8}.x

正如您可以想象的那样,如果您正在指定一堆数字,它们可能开始形成一个范围。您可以使用范围语法来合并交替。

范围

如果您要匹配的字符是范围的成员,您可以仅使用起始值和结束值,并用两个句点(..)分隔它们来指定它们。范围是另一种交替,其中每个项目都被考虑。

让我们重新审视我们的版本模式,使其仅考虑具有数字的匹配项。

branches: v{1..9}.{0..9}.x

现在我们将不再匹配very.last.x。但是,它也不会匹配v20.10.x。我们可以通过扩展范围来修复这个问题,范围不限于单个数字。

branches: v{1..99}.{0..99}.x

然而,有更有效的方法来编写这个,我们将在扩展的全局匹配部分中讨论。

回到我们的另一个例子,假设5.9.x刚刚发布,我们想将其添加到我们的Antora时代版本号模式中。我们可以从基本的交替转换为范围。

branches: 5.{7..9}.x

branches: ['5.*.x', '!5.{0..6}.x']

步骤

branches: v{2..8..2}.*.x

branches: v{1..9..2}.*.x

扩展的全局匹配和重复

  • * - 零次或多次

  • + - 一次或多次(即至少一次)

  • ? - 零次或一次(即可选)

  • @ - 正好一次(如果未指定运算符,则隐含)

  • ! - 不能出现

{0..9}的更正式方式:

@({0..9})

*({0..9})

{0..100}
虽然您可以在模式列表后面放置*,但我们不建议这样做。重复操作应始终放在模式列表之前。
v1.0.0开头的次要版本引用名称:

branches: v@({1..9})*({0..9}).+({0..9}).x

branches: v{1..9}*({0..9}).+({0..9}).x

branches: 5.!({0..5}).x

branches: '5.{{6..9},{1..9}+({0..9})}.x'

tags:
- '{5,6}.+({0..9}).+({0..9}){,-*}'
- '!5.{0..5}.*'
- '!*-M+({0..9})'