8. Extending Distutils

Distutils 可以pass多种方式扩展。大多数扩展采用新命令或替换现有命令的形式。例如,可以编写新命令来支持特定于平台的new-style包装,而可以替换现有命令来修改该命令在包装上的操作方式。

distutils 的大多数扩展都在要修改现有命令的setup.py脚本中进行;为了方便起见,许多文件只添加了一些文件 extensions,除了.py个文件外,还应将其复制到软件包中。

大多数 distutils 命令实现都是distutils.cmd.Command类的子类。新命令可以直接从Command继承,而替换命令通常间接地从Command派生,直接将其替换的命令子类化。需要命令从Command派生。

8.1. 集成新命令

有多种将新命令实现集成到 distutils 中的方法。最困难的是游说在 distutils 本身中包含新Function,然后 await(并要求)提供该支持的 Python 版本。由于许多原因,这确实很难。

对于大多数需求而言,最常见且可能最合理的方法是在setup.py脚本中包含新的实现,并导致distutils.core.setup()函数使用它们:

from distutils.command.build_py import build_py as _build_py
from distutils.core import setup

class build_py(_build_py):
    """Specialized Python source builder."""

    # implement whatever needs to be different...

setup(cmdclass={'build_py': build_py},
      ...)

如果必须使用新的实现来使用特定的程序包,则此方法最有价值,因为对该程序包感兴趣的每个人都将需要具有新的命令实现。

从 Python 2.4 开始,提供了第三个选项,旨在允许添加新命令,这些命令可以支持现有的setup.py脚本,而无需修改 Python 安装。预期这将允许第三方扩展为其他打包系统提供支持,但是该命令可用于 distutils 命令可使用的任何内容。可以使用新的配置选项command_packages(命令行选项--command-packages)来指定要搜索用于实现命令的模块的其他软件包。像所有 distutils 选项一样,可以在命令行或配置文件中指定此选项。此选项只能在配置文件的[global]部分中设置,也可以在命令行上的任何命令之前设置。如果在配置文件中设置,则可以从命令行覆盖它;在命令行上将其设置为空字符串会导致使用默认值。永远不要在软件包随附的配置文件中设置此设置。

此新选项可用于将任意数量的软件包添加到搜索到的命令实现的软件包列表中。多个软件包名称应用逗号分隔。如果未指定,则仅在distutils.command包中执行搜索。但是,当使用选项--command-packages distcmds,buildcmds运行setup.py时,将按该 Sequences 搜索软件包distutils.commanddistcmdsbuildcmds。期望pass共享相同名称的类在与该命令相同名称的模块中实现新命令。给定上面的示例命令行选项,命令 bdist_openpkg 可以由distcmds.bdist_openpkg.bdist_openpkgbuildcmds.bdist_openpkg.bdist_openpkg类实现。

8.2. 添加新的分发类型

创建发行版的命令(dist/目录中的文件)需要将(command, filename)对添加到self.distribution.dist_files,以便 upload 可以将其上传到 PyPI。该对中的* filename *不包含路径信息,仅包含文件本身的名称。在空运行模式下,仍应添加对以表示将要创建的内容。