Handbook:Parts/Working/Portage/zh-cn

欢迎使用 Portage
Portage 系统是 Gentoo 在软件管理方面最显著的创新之一. 由于 Portage 的高度灵活性和数量庞大的功能，它时常被誉为 Linux 下最好的软件管理工具.

Portage 是用 Python 和 Bash 两种语言编写的. 因为它们都是脚本语言所以用户可以直接阅读它的代码.

大多数用户通过 来调用 Portage. 本章的内容不是复述 emerge 的 man page. 要了解 emerge 的所有可用选项，请查阅 emerge 的 man page：

Ebuilds
当 Gentoo 的文档介绍关于某个软件包的时候，这意味着 Gentoo 的用户们可以在 Gentoo 的软件仓库里找到它. ebuild 是一种包含了所有 Portage 维护软件（比如安装，搜索，查询等等）所需信息的文件，而 Gentoo 的软件仓库是它们的一个集合. 这些 ebuild 文件默认储存在.

Portage 的对于软件的行为都是基于本地的 ebuild. 为了能收到新的软件包，安全更新等等，时常更新本地 ebuild 是一件很重要的事情.

更新 Gentoo 软件仓库
Gentoo 的软件仓库通常使用 进行同步，rsync 是一个快速的文件增量传输工具. 要使用它很简单，Portage 的命令行前端 提供了一个调用  的方法：

有时一些防火墙会干扰 与镜像们的连接. 在这时，我们可以使用 来自动下载和安装 Portage 树的快照版本：

使用 的另一个好处是可以只安装由 Gentoo release engineering 团队的 GPG 密钥签名过的快照. 与此有关的详细信息可以在 fetching validated Gentoo repository snapshots 找到

搜索软件
有很多方法可以在 Gentoo 的软件仓库寻找软件. 其中之一是使用 本身. 在默认情况下 会返回所有符合搜索条件的包名.

举个例子，找出所有名字里含有 “pdf” 的包：

如果要根据描述进行搜索，可以使用  （或  ）选项:

需要注意的是它会输出很多信息. 不过由于都有很清楚的标识，我们就不再赘述它们的意思了：

安装软件
当你找到了软件包的名字，安装它只需要简单得使用. 举个例子，如果要安装 gnumeric：

由于很多软件依赖其它的软件，在安装该软件的同时很可能还会安装它的一些以来. 不要担心，Portage 可以很好得处理依赖关系. 如果要知道 Portage 会安装什么软件，可以在命令中加入  选项. 举个例子：

在安装软件期间，Portage将从Internet下载必要的源代码（如果需要），并将其默认存储在 中. 之后，它将解压缩，编译和安装包. 要让Portage仅下载源代码而不安装软件，请添加 选项到emerge命令：

查找已安装软件的文档
许多软件包中包含有自己的文档，有些时候， 的USE标记决定了软件包中的自带文档是否会被安装. 您可以通过 命令来检查是否存在 USE 标志.

最好的启用  USE 的方式是在 里对想要启用的包单独启用，这样你就能只获得你想要的软件文档. 想要获取更多信息，请阅读 USE flags chapter.

当一个软件包安装结束后，它的文档通常会存放在目录下的，以软件包名命名的子目录中. 您也可以通过这个工具来列出此软件安装后生成的所有文件，这个工具来自于.

卸载软件
当您想把一个软件包从系统中移除的时候，使用 命令. 命令执行完成后，Portage将会移除此软件包安装到您系统中的所有文件，除了那些在安装软件后您修改过的配置文件. 保留这些修改过的配置文件是为了便于您今后再次使用它.

当您从系统中移除一个软件包时，之前那些为了满足其依赖关系而被自动安装的软件包将会被保留在系统中. 要使Portage找到现在可以删除的所有依赖项，可以使用  功能. 稍后我们将介绍这一点.

更新系统
要保持您的系统在最佳状态（更不用说安装那些最新的安全更新），您需要定期的更新您的系统. 由于Portage只能检查本地已有文件，因此您首先应该更新您的Portage树. 当您的Portage树更新后，您可以用 命令来更新系统. 在下一个例子里，我们还会使用  选项来控制Portage显示它要更新的软件包列表， 并让您决定是否继续更新.

Portage将搜索已安装的程序的新版本. 但是，它只会验证安装的应用程序在- 中列出的应用程序的版本 - 它不会检查它们的依赖关系. 要更新这些包的依赖关系，请添加 选项：

但是，这并不意味着更新所有的包：在编译和构建程序的过程中需要系统上的一些依赖程序，但是一旦安装了这些软件，就不再需要这些依赖. Portage调用那些“构建依赖”. 要在更新这些内容，请添加 ：

因为有时开发者会为那些您没有明确要求安装（但被其他软件包依赖而装入系统中）的包推出安全更新，我们也推荐偶尔运行一下这个命令.

每当您改变了系统中任何的USE标记后，最好加入 选项. 这样Portage将会验证这个USE标记的变动是否导致需要安装新的软件包或者将现有的包重新编译.

Meta软件包
Gentoo中的一些软件包并没有包含任何实际的内容，而只是用来安装一系列软件包的集合. 例如， 包就是一个包含了一系列与KDE相关的互相依赖的软件包的集合，您可以通过安装它来在系统中搭建起一个完整的KDE环境.

如果您试图从系统中移除一个这样的软件包的集合体，只是单纯地使用 命令并不能完成您的要求，原因在于这些包的依赖关系仍然保留在系统中.

不用担心，Portage也提供了移除孤立依赖的软件包的功能，但由于软件包间的依赖关系是动态的，您首先需要充分地更新您的整个系统，包括更改USE标记设定而导致的变化. 在这之后您可以运行来移除那些完全没有被其他包依赖的软件包. 移除之后你需要重新编译那些曾经与刚刚移除的这些包动态连接过的应用程序，因为实际上这些程序不需要那些包.

所有这些可以用以下三个命令来实现：

工具由 包提供；使用前别忘了首先安装它：

授权协议
从Portage版本2.1.7开始，可以根据其授权协议接受或拒绝安装软件. portage 树中的所有包在其ebuild中包含一个 LICENSE 选项. 运行 将显示软件包的许可证.

默认情况下，Portage允许所有授权协议，除了需要阅读和签署接受协议的“最终用户许可协议（EULA）”.

控制允许的许可证的变量称为 ACCEPT_LICENSE ，可以在文件中设置. 在下一个示例中，将显示他的默认值：

使用此配置，在安装期间需要进行人机交互以接受其EULA的软件包将无法安装. 不带EULA的软件包将可安装.

可以在 ACCEPT_LICENSE 中全局设置t ACCEPT_LICENSE ，或者在 文进行配置.

举个例子，要允许 包的的授权协议， 把下面的内容添加到 :

这允许安装 程序包，但禁止安装 程序包，即使它具有相同的 授权协议.

在 ACCEPT_LICENSE 变量中定义的许可证组前缀为 符号. 如果要设置成只允许安装自由软件和文档，要完成此操作：删除所有当前接受的许可证（使用(using )），然后只允许FREE组中的许可证如下：

在这种情况下，“free”主要由FSF和OSI定义. 任何其许可证不符合这些要求的软件包将无法在系统上安装.

术语
正如我们之前指出的那样，Portage是一个非常强大并支持许多特性的软件包管理工具，而这是其他类似工具所欠缺的. 为了理解这一点，我们为您粗略地解释一些Portage的面貌.

With Portage different versions of a single package can coexist on a system. While other distributions tend to name their package to those versions (like freetype and freetype2) Portage uses a technology called SLOTs. An ebuild declares a certain SLOT for its version. Ebuilds with different SLOTs can coexist on the same system. For instance, the freetype package has ebuilds with SLOT="1" and SLOT="2".

There are also packages that provide the same functionality but are implemented differently. For instance, metalogd, sysklogd, and syslog-ng are all system loggers. Applications that rely on the availability of "a system logger" cannot depend on, for instance, metalogd, as the other system loggers are as good a choice as any. Portage allows for virtuals: each system logger is listed as an "exclusive" dependency of the logging service in the logger virtual package of the virtual category, so that applications can depend on the package. When installed, the package will pull in the first logging package mentioned in the package, unless a logging package was already installed (in which case the virtual is satisfied).

Software in the Gentoo repository can reside in different branches. By default the system only accepts packages that Gentoo deems stable. Most new software titles, when committed, are added to the testing branch, meaning more testing needs to be done before it is marked as stable. Although the ebuilds for those software are in the Gentoo repository, Portage will not update them before they are placed in the stable branch.

有些软件只在某几个体系结构上可用. 或者在其他体系结构中还不能运行，或者仍需要对其进行更多的测试，或者将软件提交到Portage树中的开发者还不能确定这个软件能否运行于其他体系结构.

Each Gentoo installation also adheres to a certain profile which contains, amongst other information, the list of packages that are required for a system to function normally.

被阻挡的包
Ebuilds contain specific fields that inform Portage about its dependencies. There are two possible dependencies: build dependencies, declared in the DEPEND variable and run-time dependencies, likewise declared in RDEPEND. When one of these dependencies explicitly marks a package or virtual as being not compatible, it triggers a blockage.

While recent versions of Portage are smart enough to work around minor blockages without user intervention, occasionally such blockages need to be resolved manually.

为了使安装得以继续进行，您可以选择不安装这个软件包，或者先将发生冲突的包卸载. 例如，在我们给出的这个例子中，您可以选择不安装postfix，或者先卸载ssmtp.

Sometimes there are also blocking packages with specific atoms, such as. In this case, updating to a more recent version of the blocking package could remove the block.

也有可能两个需要安装的包互相阻挡. 这种少见的情况下，您应该明确自己为什么需要同时安装它们. 绝大多数时候您只需要安装它们之中的一个就可以了. 如果不是这样，请您到Gentoo的bug跟踪系统中提交一个bug.

被屏蔽的包
当您想安装一个对于您系统不可用的软件包. 您会收到类似这样的屏蔽错误提示. 您应该试着安装那些对于您系统可用的程序或者等待那些不可用的包被置为可用的. 通常一个软件包被屏蔽的原因在于：

Necessary USE flag changes
The error message might also be displayed as follows, if  isn't set:

Such warning or error occurs when a package is requested for installation which not only depends on another package, but also requires that that package is built with a particular USE flag (or set of USE flags). In the given example, the package app-text/feelings needs to be built with USE="test", but this USE flag is not set on the system.

To resolve this, either add the requested USE flag to the global USE flags in, or set it for the specific package in.

Missing dependencies
The application to install depends on another package that is not available for the system. Please check Bugzilla if the issue is known and if not, please report it. Unless the system is configured to mix branches, this should not occur and is therefore a bug.

Ambiguous ebuild name
The application that is selected for installation has a name that corresponds with more than one package. Supply the category name as well to resolve this. Portage will inform the user about possible matches to choose from.

Circular dependencies
Two (or more) packages to install depend on each other and can therefore not be installed. This is most likely a bug in one of the packages in the Gentoo repository. Please re-sync after a while and try again. It might also be beneficial to check Bugzilla to see if the issue is known and if not, report it.

Fetch failed
Portage was unable to download the sources for the given application and will try to continue installing the other applications (if applicable). This failure can be due to a mirror that has not synchronized correctly or because the ebuild points to an incorrect location. The server where the sources reside can also be down for some reason.

Retry after one hour to see if the issue still persists.

System profile protection
The user has asked to remove a package that is part of the system's core packages. It is listed in the profile as required and should therefore not be removed from the system.

Digest verification failure
This is a sign that something is wrong with the Gentoo repository - often, it is because a developer may have made a mistake when committing a package to the tree.

When the digest verification fails, do not try to re-digest the package personally. Running will not fix the problem; it will almost certainly make it worse!

Instead, wait an hour or two for the tree to settle down. It's likely that the error was noticed right away, but it can take a little time for the fix to trickle down the Gentoo repository. Check Bugzilla and see if anyone has reported the problem yet or ask around on (IRC). If not, go ahead and file a bug for the broken package.

Once the bug has been fixed, re-sync the Gentoo repository to pick up the fixed digest.