GLEP 21:用户定义的包集

作者 Tal Peer <coredumb@gentoo.org>,Alec Warner <antarus@gentoo.org>
类型 标准跟踪
状态 最终版
版本 1
创建日期 2004-02-22
最后修改日期 2016-02-25
发布历史 2004-03-06, 2006-09-03
GLEP 源代码 glep-0021.rst

状态

已废弃。Portage-2.2 中已添加了包集支持,但在许多情况下它与本文档中的描述不符,并且本文档在包集的行为和限制方面存在几个主要差距。

摘要

在 Portage 中,包集(以前称为“类”或“目标”)仅仅是一组软件包,它们被分组在一起以方便更新和处理。目前,除了两个默认的包集:“system” 和 “world” 之外,无法定义其他包集。

动机

几个月来,用户和开发人员提出了很多关于用户定义包集的请求,无论是通过发布 Bug、发送邮件列表消息还是在 IRC 上。通常的回复是这是一个很棒的想法,但没有人真正花时间来正确定义并实现它。

本文档提供了一个使用类似于当前 world/system 包集使用的配置文件来实现用户定义包集的规范。

规范

建议的实现采用每个包集一个文件的方法,这意味着每个包集都在一个单独的文件中定义。所有包集定义文件都将位于目录/etc/portage/sets/中,每个包集的名称将是其文件名。因此,如果在 /etc/portage/sets/foo-set 中定义了一个包集,则该包集的名称将为“foo-set”。通常的包命名规则 [1] 也适用于包集。

由于不可能在同一个目录中创建两个或多个具有相同名称的文件,因此理论上两个不同的包集共享相同名称的冲突是不可能的。但是,用户可以定义一个包集,其名称与一个或多个软件包冲突(有关歧义解决,请参见下文)。

包列表文件的语法与 world 文件的语法相同,如 Portage 手册页 [2] 中所述,并增加了一项:包集不能被其他包集“继承”,只能列出软件包。包集中的软件包数量或一个软件包所属的包集数量没有限制。

使用 emerge 时的用户定义集

用户定义的包集可以直接使用或使用 --package-set 选项使用,例如

# Basically the same:
emerge foo-set
emerge --package-set foo-set

引入 --package-set 选项是为了避免歧义,如以下示例所示

emerge foo                # Where foo is both a set and a one or more
                          # existing packages. This will cause emerge to show
                          # the ambiguity, ask us to be more
                          # specific, and stop.

emerge --package-set foo  # So we specify that what we actually
                          # meant was the package set.

emerge cat-bar/foo        # Or we specify the exact package name.

在使用 --pretend 选项运行 emerge 时,包集将在输出中展开为其包含的软件包,就像当前系统定义的包集一样。

每次只能将一个包集传递给 Portage,并且不能将包集与普通软件包混合使用。因此,以下代码段均无效,并将导致错误(假设foo-setbar-set被定义为包集)

emerge foo-set glibc
emerge bar-set system
emerge world foo-set gcc

与其他 Portage 功能的兼容性

  • 依赖项:普通软件包和 eclass 不能依赖于包集(系统定义和用户定义)。
  • package.mask:禁止通过package.mask文件屏蔽包集。为了“屏蔽”包集,应将其从 sets 目录中移走。
  • package.use:不能在package.use文件中为包集定义 USE 标记。

实现

Portage 中包集概念的实现主要应在 portage.py 中完成,并且仅应在 emerge 本身中添加接口部分,以保持接口和逻辑之间的分离。

实现所需的工作量并非微不足道,但也并非巨大。

基本原理

每个包集一个文件的方法使得只需列出/etc/portage/sets目录内容即可轻松列出系统上定义的包集。此外,它使包集查找过程更高效,因为它只需要检查文件是否存在。

我选择使用 --package-set 选项而不是 --set 选项来明确告诉 Portage 构建一个包集,主要是因为 --set 暗示设置环境变量或类似内容。

允许通过package.use文件操作包集的 USE 标记弊大于利,原因如下

  • 如果为一个包集启用了 USE 标记(例如“foo”),并且为属于该包集的软件包禁用了相同的 USE 标记(例如“-foo”),则不清楚哪个设置应优先。
  • 类似地,如果为一个包集启用了 USE 标记,并且为属于原始包集的子集的包集禁用了相同的 USE 标记,则不清楚哪个设置应优先。
  • 如果为包集定义了 USE 标记(禁用或启用),并且要构建属于该包集的软件包,则不清楚在构建相关软件包时是否应定义 USE 标记。

因此,我决定最好禁止为包集设置 USE 标记。

向后兼容性

可以通过以下两种方式之一保持与当前仅存在两个系统定义包集的情况的向后兼容性

  1. 保持现状 - “world” 和 “system” 包集在 Portage 中是硬编码的。
  2. /etc/portage/sets/目录下分发默认的“system” 和 “world” 文件。

除此之外,没有其他向后兼容性问题。