包和槽位移动
本章介绍包和槽位移动的使用。包更新机制是一个强大的工具,需要谨慎使用。特别需要注意以下几点
- 更新不是一次性操作,它们也不是有状态的。所有更新都可以多次应用于同一个系统,所有旧的更新都会应用于新的 Gentoo 安装。
- 创建更新条目后,就不能将旧的包名(或槽位)重新用于另一个包。尝试重新使用它会导致更新再次应用于重用的名称。这也意味着,虽然可以将包移回其之前的名称,但所有历史上用于该包的名称都将被该包独占。
- 更新只能执行一对一移动。它们不能用于合并包。尝试将两个或多个包移动到单个名称可能会给用户带来严重的问题。
移动或重命名包
移动或重命名包(有时称为“pkgmove”或简称“move”)需要多个操作。首先,验证 ebuild 在移动后是否能继续正常工作。如果类别发生变化,必须验证所有${CATEGORY}
的使用。如果包名发生变化,必须验证${PN}
、${P}
等。无论何时需要旧值,请用逐字文本替换变量引用,这样就不会受移动的影响。在移动包之前单独提交更改。
之后,使用git mv
移动包文件。按照以下格式将移动条目添加到profiles/updates/
中
move old-category/old-name new-category/new-name
在更新条目之后,找到所有对旧包名的引用并更新它们。这些包括
-
依赖项、
optfeature.eclass
的使用、has_version
和best_version
在其他 ebuild 和 eclass 中的使用 - 所有
profiles/
树条目(例如profiles/package.mask
) -
restrict
包metadata.xml
文件中的条目,以及<pkg/>
标签 - 新闻项目
Display-If-Installed
- 公开的 bug 摘要
- 维基页面
最好将所有这些更改合并到一个提交中,以确保更新过程的原子性。
更改 ebuild 的 SLOT
更改 ebuild 的SLOT
(“slotmove”)的过程与之前过程非常相似。除了在 ebuild 文件中更改SLOT
之外,还需要在 Gentoo 存储库中的profiles/updates/
中创建新的条目,格式如下
slotmove app-text/gtkspell 0 2
确保已修复所有反向依赖项,并且已更新profiles/
目录中所有可能受更改影响的条目。
再次移动包时更新之前的更新条目
再次移动同一个包时,应适当地更新之前的更新条目。这样做是为了让阅读更新条目的用户更清楚地了解情况,并确保即使包管理器没有以健壮的方式实现更新,该过程也能有效地处理。这涉及以下步骤
- 必须更新该包之前的包移动,以引用最终名称。也就是说,我们希望有 2 个更新条目:A → C 和 B → C,而不是 A → B → C。
- 如果该包正被移动到它之前使用的名称,则必须删除原始移动条目。也就是说,我们希望有反向条目:B → A,而不是 A → B → A。如果包管理器之前没有移动 A → B,我们希望它根本不触碰该包。
- 结合上述两个步骤,A → B → C → A 的链将被替换为两个移动:B → A 和 C → A。
- 如果该包之前已进行槽位移动,则应更新槽位移动以使用最终的包名,并将其移到最终的包移动之后。也就是说,我们希望有 A → B、B:S1 → B:S2 的链,而不是 A:S1 → A:S2、A → B 的链。然后,所有包和槽位移动条目都必须位于同一个文件中,以保证顺序处理。