打包流程#
本文档旨在概述发布/分发分发包所涉及的流程,通常是分发到Python 包索引 (PyPI)。它是为包发布者编写的,假定包发布者是包作者。
虽然教程介绍了为发布准备简单包的过程,但它并没有完全列举需要哪些步骤和文件,以及它们的用途。
发布包需要从作者的源代码到最终用户的 Python 环境的流程。实现此目标的步骤如下
拥有包含包的源代码树。这通常是从版本控制系统 (VCS) 中检出的内容。
准备一个配置文件,描述包元数据(名称、版本等)以及如何创建构建工件。对于大多数包,这将是一个
pyproject.toml
文件,在源代码树中手动维护。创建要发送到包分发服务(通常是 PyPI)的构建工件;这些通常是一个源分发 (“sdist”)和一个或多个构建分发 (“wheels”)。这些是由构建工具使用上一步中的配置文件制作的。对于纯 Python 包,通常只有一个通用 wheel。
将构建工件上传到包分发服务。
此时,包已存在于包分发服务中。要使用该包,最终用户必须
从包分发服务下载包的构建工件之一。
将其安装在他们的 Python 环境中,通常是在其
site-packages
目录中。此步骤可能涉及构建/编译步骤,如果需要,必须由包元数据描述。
当最终用户运行pip install
时,通常由pip执行最后 2 个步骤。
以上步骤将在下面进行更详细的描述。
源代码树#
源代码树包含包源代码,通常是从 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。具有已编译二进制扩展的软件包需要一个 wheel,用于支持的 Python 解释器、操作系统和 CPU 架构的每种受支持的组合。如果找不到合适的 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