7. 扩展distutils¶
注解
本文件仅保留至 setuptools
https://setuptools.readthedocs.io/en/latest/setuptools.html上的文档独立地涵盖了此处当前包含的所有相关信息。
distutils可以以各种方式扩展。大多数扩展采用新命令或现有命令的替换形式。例如,可以编写新的命令来支持新的平台特定的打包类型,而可以替换现有的命令来修改命令如何在包上操作的详细信息。
distutils的大多数扩展都是在 setup.py
要修改现有命令的脚本;许多脚本只需添加一些文件扩展名,除了 .py
方便的文件。
大多数distutils命令实现都是 distutils.cmd.Command
类。新命令可以直接从继承 Command
,而替换通常源于 Command
间接地,直接子类化它们要替换的命令。命令必须派生自 Command
.
7.1. 集成新命令¶
有不同的方法可以将新的命令实现集成到distuils中。最困难的是游说将新特性包含在distutils本身中,并等待(并且需要)提供这种支持的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
包裹。什么时候? setup.py
使用选项运行 --command-packages distcmds,buildcmds
但是,这些包 distutils.command
, distcmds
和 buildcmds
将按该顺序搜索。新命令应该由共享相同名称的类在与命令同名的模块中实现。给定上面的示例命令行选项,命令 bdist_openpkg 可以由类实现 distcmds.bdist_openpkg.bdist_openpkg
或 buildcmds.bdist_openpkg.bdist_openpkg
.
7.2. 添加新的分发类型¶
创建分发的命令(在 dist/
目录)需要添加 (command, filename)
配对对 self.distribution.dist_files
以便 upload 可以上传到pypi。这个 filename 在该对中不包含路径信息,只包含文件本身的名称。在干运行模式下,仍应添加对以表示将要创建的内容。