打包流程¶
本文档旨在概述发布/分发分发包(通常到 Python 包索引 (PyPI))所涉及的流程。它是为包发布者编写的,假定他们是包的作者。
虽然教程详细介绍了准备一个简单包以供发布的流程,但它没有完全列举所需的步骤和文件以及其目的。
发布一个包需要从作者的源代码到最终用户的 Python 环境的流程。实现这一目标的步骤是:
拥有包含该包的源代码树。这通常是从版本控制系统 (VCS) 中检出的。
准备一个配置文件,描述包的元数据(名称、版本等)以及如何创建构建工件。对于大多数包,这将是一个
pyproject.toml文件,在源代码树中手动维护。创建要发送到包分发服务(通常是 PyPI)的构建工件;这些通常将是一个源分发 (“sdist”)和一个或多个构建分发 (“wheels”)。这些是由构建工具使用上一步的配置文件创建的。对于纯 Python 包,通常只有一个通用 wheel。
将构建工件上传到包分发服务。
此时,该包已存在于包分发服务上。要使用该包,最终用户必须:
从包分发服务下载该包的一个构建工件。
将其安装到他们的 Python 环境中,通常是安装到其
site-packages目录中。此步骤可能涉及构建/编译步骤,如果需要,必须在包元数据中描述。
当最终用户运行pip install时,这最后 2 个步骤通常由pip执行。
上述步骤将在下面更详细地描述。
源代码树¶
源代码树包含包的源代码,通常是从 VCS 中检出的。用于创建构建工件的特定代码版本通常是基于与版本关联的标签的检出。
配置文件¶
配置文件取决于用于创建构建工件的工具。标准做法是使用TOML 格式的pyproject.toml文件。
至少,pyproject.toml文件需要一个[build-system]表,指定您的构建工具。有许多可用的构建工具,包括但不限于flit、hatch、pdm、poetry、Setuptools、trampolim 和 whey。每个工具的文档都会说明在[build-system]表中要填写什么。
例如,这是使用hatch的表
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
在pyproject.toml文件中包含这样一个表后,像build这样的“前端”工具可以运行您选择的构建工具的“后端”来创建构建工件。您的构建工具也可能提供自己的前端。像pip这样的安装工具在从源分发安装时运行您的构建工具的后端时也充当前端。
您选择的特定构建工具决定了pyproject.toml文件中需要哪些额外信息。例如,您可以指定
一个包含项目核心元数据(名称、版本、作者等)的
[project]表,一个包含工具特定配置选项的
[tool]表。
有关pyproject.toml配置的完整指南,请参阅pyproject.toml 指南。
构建工件¶
源分发 (sdist)¶
源分发包含足够的信息,可以从源代码在最终用户的 Python 环境中安装包。因此,它需要包源代码,并且可能还包括测试和文档。这些对于希望开发您的源代码的最终用户以及需要某些本地编译步骤(例如 C 扩展)的最终用户系统非常有用。
build包知道如何调用您的构建工具来创建一个这样的文件
python3 -m build --sdist source-tree-directory
或者,您的构建工具可能提供自己的接口来创建 sdist。
构建分发 (wheels)¶
构建分发只包含最终用户的 Python 环境所需的文件。安装过程中不需要编译步骤,wheel 文件可以直接解压到site-packages目录中。这使得最终用户的安装更快、更方便。
纯 Python 包通常只需要一个“通用”wheel。带有编译二进制扩展的包需要为它支持的 Python 解释器、操作系统和 CPU 架构的每种组合提供一个 wheel。如果没有可用的合适 wheel 文件,像pip这样的工具将回退到安装源分发。
build包知道如何调用您的构建工具来创建一个这样的文件
python3 -m build --wheel source-tree-directory
或者,您的构建工具可能提供自己的接口来创建 wheel。
注意
build的默认行为是从当前目录中的源代码同时创建 sdist 和 wheel;上述示例是特意明确的。
上传到包分发服务¶
twine工具可以使用如下命令将构建工件上传到 PyPI 进行分发:
twine upload dist/package-name-version.tar.gz dist/package-name-version-py3-none-any.whl
或者,您的构建工具可能提供自己的上传接口。
下载并安装¶
现在包已发布,最终用户可以将包下载并安装到他们的 Python 环境中。通常使用pip完成,使用如下命令:
python3 -m pip install package-name