包和类别 metadata.xml

metadata.xml 文件用于指定有关包或类别的附加数据。

语法

元数据文件遵循 GLEP 68 中定义的语法。字符集必须为 UTF-8,如 GLEP 31 所指定。

关于缩进,没有严格的规则来规定样式和宽度。但是,以下最小的规则集需要遵循

  • 缩进应该一致,即使用空格或制表符,但不能同时使用两者。
  • 当接触属于其他开发人员的 metadata.xml 文件时,请保持现有样式。

下表总结了可能出现在 metadata.xml 中的标签

标签 描述
<catmetadata> 这是类别的 metadata.xml 文件的根元素。它没有属性。它包含许多 <longdescription> 标签,每个标签代表不同的语言。
<pkgmetadata> 这是包的 metadata.xml 文件的根元素。它没有属性。允许以下子标签:<maintainer><longdescription><stabilize-allarches><slots><use><upstream>。虽然所有子标签都是可选的,但 <upstream> 最多只能出现一次。
<maintainer> 此标签指定负责维护包的人员和/或项目。必须指定 type 属性,它可以是 "person""project"。有一个必需的子标签:<email>。它有两个可选子标签:<name><description>
<email> 这包含维护者的电子邮件地址。这是必需的。
<name> 这包含维护者姓名的自由文本。这是可选的。
<description> description 标签包含维护者职责的描述,例如,有人可能对接管维护者职责感兴趣的备注。这是可选的。
<longdescription> 此标签包含类别或包的描述。对于包,它用于增强 ebuild 本身中的 DESCRIPTION 字段。此标签有两个可选子标签:<pkg><cat>
<stabilize-allarches> 指示与架构无关的包。当 ebuild 仅在一个架构上经过测试时,它可以被标记为对所有相关架构稳定。此标签必须为空内容。
<slots> 此标签描述包的 。它有两个可选子标签:<slot><subslots>
<slot> 这包含特定槽的信息。name 属性是强制性的,并指定槽的名称。
<subslots> 描述整个包的子槽的含义。此标签最多只能出现一次。
<use> 此标签包含对 USE 标志 的描述。此标签是可选的,如果指定,则有一个必需的子标签:<flag>
<flag> 此标签包含对命名 USE 标志如何影响此包的描述。如果指定了 <use> 标签,则它是必需的。它还要求在 name 属性中命名 USE 标志。此标签有两个可选子标签:<pkg><cat>
<upstream> 此标签包含有关上游开发人员/项目的信息。它支持多个可选子标签:<maintainer><changelog><doc><bugs-to>,<remote-id>
<maintainer> 提供有关上游维护者的信息。它要求指定 <name> 子标签,支持可选的 <email> 子标签和可选的 status 属性。请注意,对于上游维护者,不得指定 type 属性。
<name> 上游维护者的姓名应包含一段包含上游名称的文本。此元素对于上游维护者是强制性的,并且必须恰好出现一次。
<email> 上游维护者的电子邮件地址。最多只能出现一次。
<changelog> 应包含一个 URL,其中包含上游变更日志的位置。URL 必须与版本无关,并且必须指向一个仅在对应包的新版本发布时更新的变更日志。(这也意味着在仅使用 vcs 快照的情况下,可以链接到自动更新的变更日志)。最多只能出现一次。
<doc> 应包含一个 URL,其中包含上游文档的位置。该链接不能指向任何第三方文档,并且必须与版本无关。如果文档有多种语言版本,可以使用 lang 属性,该属性遵循与 <longdescription> 相同的规则。
<bugs-to> 应包含一个可以提交错误的位置,一个 URL 或一个以 mailto: 为前缀的电子邮件地址。最多只能出现一次。
<remote-id> 应指定一种包标识跟踪器类型以及对应于该包的标识。remote-id 应该让索引信息(例如其 Freshmeat ID 或其 CPAN 名称)变得更容易。它有一个强制性的属性 type,用于识别上游源的类型。
<pkg> 此标签包含有效的限定包名称。
<cat> 此标签包含有效的类别名称,如 profiles/categories 中定义的那样。

还有一些属性可以与这些标签一起使用

属性 标签 描述
lang <description><longdescription><slots><use><doc> 在需要描述的每种情况下,都必须至少有一个英语描述。如果给出了另一种语言的额外描述,则此属性用于指定使用的语言。格式是 BCP 47 规范定义的 IETF 语言标签。大多数情况下,这将是两位字符的语言代码。
restrict <maintainer><longdescription><stabilize-allarches><flag> restrict 属性允许将某些标签的应用限制到包的某些版本。restrict 属性的格式与 EAPI 0 包依赖项规范的格式相同(即,不允许使用 USE 条件依赖项或槽依赖项)。由于 <> 是 XML 中的特殊字符,因此必须使用 &lt;&gt; 对它们进行转义。
name <flag><slot> 当此属性在 <flag> 标签上是必需的时,它只包含 USE 标志的名称。对于 <slot> 标签,它指定 槽名称,它适用于该标签。槽名称为 * 允许单个 <slot> 标签匹配包的所有槽,在这种情况下,不能存在其他槽标签。
status <maintainer> 上游维护者元素具有一个 status 属性,该属性是 "active""inactive" 之一。此属性不是强制性的。它的缺失应解释为 "unknown"。请注意,此属性仅允许用于 <upstream> 元素的 <maintainer> 子标签!
type <remote-id> 一个用于标识上游源类型的字符串。有效的字符串列表在metadata.dtd中维护。开发者在使用新的类型值之前,应先向gentoo-dev邮件列表发送邮件。
type <maintainer> 定义包维护者的类型。只有两个有效值:"person""project"。后者表示一个官方的Gentoo 项目

包元数据

所有包**必须**包含一个metadata.xml 文件,其中提供有关包描述、维护者、本地USE标志、上游等信息。

为了方便开发者,Gentoo树中提供了一个名为 skel.metadata.xml 的骨架文件。元数据文件也可以使用app-portage/metagen 工具创建。

包元数据文件的提交由pkgdev在常规包维护过程中处理。

除非另有说明,否则根据 GLEP 67,元数据中第一个列出的维护者应是该包错误的分配者。

包元数据示例

在接下来的部分中,提供了各种metadata.xml的示例。这些示例基于实际的包元数据文件,以尽可能保持真实性。但是,它们可能不包含这些文件逐字逐句,应视为假设性示例。

项目作为维护者

第一个示例展示了一个由单个项目维护的包。它是包app-office/libreofficemetadata.xml的简化版本。包维护者由电子邮件地址[email protected]标识,名称为Gentoo Office Project,如可选的<name>子标签中所指定。它还提供了长包描述。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer type="project">
    <email>[email protected]</email>
    <name>Gentoo Office Project</name>
  </maintainer>
  <longdescription>
    LibreOffice is the successor of OpenOffice.org. This ebuild
    allows you to compile it yourself. Unfortunately this compilation can
    take up to a day depending on the speed of your computer. It will
    however make a snappier LibreOffice than the binary version.
  </longdescription>
</pkgmetadata>

电子邮件地址[email protected]对应于 projects.xml中定义的Gentoo Office Project。此文件列出了Gentoo中的所有项目,它是由 项目列表(在Gentoo Wiki上提供)生成的。

<project>
  <email>[email protected]</email>
  <name>Gentoo Office Project</name>
  <url>https://wiki.gentoo.org/wiki/Project:Office</url>
  <description>
    The Office project manages the office implementations
    and related packages in Gentoo.
  </description>
  <member>
    <email>[email protected]</email>
    <name>Andreas K. Hüttel</name>
    <role>member</role>
  </member>
  <member>
    <email>[email protected]</email>
    <name>Tomáš Chvátal</name>
    <role>member</role>
  </member>
</project>

本地USE标志描述

第二个示例是根据sys-apps/portagemetadata.xml构建的。它列出了多个维护者,其中一个是开发者,另一个是项目。它说明了如何指定本地USE标志描述,并且还包含一个上游元素。还值得注意的是,在<bugs-to>标签中使用mailto:前缀,因为存在电子邮件地址而不是URL。相反,在<email>标签中指定的电子邮件地址不需要这种前缀。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer type="person">
    <email>[email protected]</email>
    <name>Larry the Cow</name>
  </maintainer>
  <maintainer type="project">
    <email>[email protected]</email>
  </maintainer>
  <use>
    <flag name="epydoc">Build html API documentation with epydoc.</flag>
    <flag name="ipc">Use inter-process communication between Portage and running ebuilds.</flag>
    <flag name="pypy2_0">Use pypy-c2.0 as Python interpreter.</flag>
    <flag name="python2">Use python2 as Python interpreter.</flag>
    <flag name="python3">Use python3 as Python interpreter.</flag>
    <flag name="xattr">
      Preserve extended attributes (filesystem-stored metadata) when
      installing files. Usually only required for hardened systems.
    </flag>
  </use>
  <upstream>
    <bugs-to>mailto:[email protected]</bugs-to>
    <changelog>https://gitweb.gentoo.org/proj/portage.git/plain/RELEASE-NOTES</changelog>
    <doc>https://wiki.gentoo.org/wiki/Handbook:AMD64/Working/Portage</doc>
  </upstream>
</pkgmetadata>

拆分维护权

此示例使用属性restrict根据包版本拆分维护权。根据sys-boot/grubmetadata.xml,版本2及以上的ebuild由[email protected]维护,而早期版本由Gentoo Base System项目维护。请注意在restrict中使用“&gt;”而不是“>”。

此示例还在USE标志描述中使用了<pkg>标签。槽位依赖关系说明符不允许在<pkg>内部使用,因此采用<pkg>sys-boot/grub</pkg>:2的表示法,而不是<pkg>sys-boot/grub:2</pkg>

最后,演示了上游描述中的<remote-id>标签。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer restrict="&gt;=sys-boot/grub-2" type="person">
    <email>[email protected]</email>
  </maintainer>
  <maintainer type="project">
    <email>[email protected]</email>
    <name>Gentoo Base System</name>
  </maintainer>
  <use>
    <flag name="device-mapper">
      Enable support for device-mapper from <pkg>sys-fs/lvm2</pkg>
    </flag>
    <flag name="efiemu">
      Build and install the efiemu runtimes
    </flag>
    <flag name="fonts">Build and install fonts for the gfxterm module</flag>
    <flag name="mount">
      Build and install the grub-mount utility
    </flag>
    <flag name="libzfs">
      Enable support for <pkg>sys-fs/zfs</pkg>
    </flag>
    <flag name="multislot">
      Allow concurrent installation of <pkg>sys-boot/grub</pkg>:0 and
      <pkg>sys-boot/grub</pkg>:2 by renaming all programs.
    </flag>
    <flag name="themes">Build and install GRUB themes (starfield)</flag>
    <flag name="truetype">
      Build and install grub-mkfont conversion utility
    </flag>
  </use>
  <upstream>
    <remote-id type="sourceforge">dejavu</remote-id>
  </upstream>
</pkgmetadata>

槽位和子槽位

此示例的重点是通过检查media-libs/libpng的元数据来演示如何指定槽位和子槽位。根据包的性质,可能有多种槽位的原因。对于这个特定的包,可以看出槽位用于提供不同版本的库,这些库具有不同的二进制兼容性,并且建议开发者针对槽位0进行构建。此外,根据<subslots>标签中指定的描述,具有相同子槽位的不同版本的此包提供了相同的应用程序二进制接口(ABI)。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<pkgmetadata>
  <maintainer type="project">
    <email>[email protected]</email>
    <name>Gentoo Base System</name>
  </maintainer>
  <use>
    <flag name="apng">support unofficial APNG (Animated PNG) spec</flag>
  </use>
  <upstream>
    <remote-id type="cpe">cpe:/a:libpng:libpng</remote-id>
    <remote-id type="sourceforge">apng</remote-id>
  </upstream>
  <slots>
    <slot name="0">
      For building against. This is the only slot
      that provides headers and command line tools.
    </slot>
    <slot name="1.2">
      For binary compatibility, provides libpng12.so.0 only.
    </slot>
    <slot name="1.5">
      For binary compatibility, provides libpng15.so.15 only.
    </slot>
    <subslots>Reflect ABI compatibility for libpng.so.</subslots>
  </slots>
</pkgmetadata>

需要维护者

需要维护者(“孤立”)的包没有负责它们的维护者。根据 GLEP 67,这些包的metadata.xml<pkgmetadata>下的<maintainer>子标签必须不包含任何内容。对此条件的严格测试将是

[[ $(xmllint --xpath "count(/pkgmetadata/maintainer)" metadata.xml) -eq 0 ]]

按照惯例,会插入包含字符串maintainer-needed的注释行。与包相关的其他标签可能存在于元数据中。这些包的错误必须分配给[email protected]。QA团队定期生成 孤立包列表以及它们相应的错误,作为QA报告的一部分。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE pkgmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<pkgmetadata>
  <!-- maintainer-needed -->
  <upstream>
    <maintainer status="active">
      <email>[email protected]</email>
      <name>Matt Rasmussen</name>
    </maintainer>
    <doc lang="en">http://keepnote.org/manual/</doc>
    <bugs-to>https://code.google.com/p/keepnote/issues/list</bugs-to>
  </upstream>
  <longdescription lang="en">
    KeepNote is a note taking application. With KeepNote, you can
    store your class notes, TODO lists, research notes, journal entries,
    paper outlines, etc in a simple notebook hierarchy with rich-text
    formatting, images, and more. Using full-text search, you can
    retrieve any note for later reference.
  </longdescription>
</pkgmetadata>

类别元数据

对于类别,metadata.xml指定了长描述(英文和可选的其他语言)。一个典型的例子

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE catmetadata SYSTEM "https://gentoolinux.cn/dtd/metadata.dtd">
<catmetadata>
  <longdescription lang="en">
    The app-vim category contains plugins and syntax file
    packages for the Vim text editor.
  </longdescription>
  <longdescription lang="de">
    Die Kategorie app-vim enthält Plugins und Syntax-Pakete
    für den Vim Texteditor.
  </longdescription>
</catmetadata>

创建新类别时,创建metadata.xml文件以及英文版<longdescription>是**强制性**的。翻译由任何有兴趣的开发人员处理,他们能说足够流利的语言。

目前提交类别 metadata.xml文件的正确方法是

xmllint --noout --valid metadata.xml
git add metadata.xml
git commit --gpg-sign

提交信息应格式正确。下面显示了一个示例提交

commit db359439bcd52f5a7f20d2332ab62feb16657504
Author: Alexis Ballier <[email protected]>
Date:   Tue Sep 22 10:47:49 2015 +0200

  dev-ros: Add metadata.xml for the category.