如何在不使用 setup.py 文件的情况下构建源代码分发版?

pla*_*pus 22 python setuptools pypi python-packaging pyproject.toml

具有以下包结构

.
??? my_package
?   ??? __init__.py
??? setup.cfg
??? setup.py
Run Code Online (Sandbox Code Playgroud)

的内容 setup.py

from setuptools import setup
setup()
Run Code Online (Sandbox Code Playgroud)

的内容 setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:
Run Code Online (Sandbox Code Playgroud)

我可以my_package像这样构建轮子或源代码分发

pip wheel --no-deps -w dist .
# generates file ./dist/my_package-0.1-py3-none-any.whl
python setup.py sdist
# generates file ./dist/my_package-0.1.tar.gz
Run Code Online (Sandbox Code Playgroud)

但是根据setuptools 的维护者的说法,声明式构建配置是理想的,使用命令式构建将是一种代码味道。所以我们替换setup.pypyproject.toml

.
??? my_package
?   ??? __init__.py
??? setup.cfg
??? pyproject.toml
Run Code Online (Sandbox Code Playgroud)

的内容 pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]
Run Code Online (Sandbox Code Playgroud)

你仍然可以像以前一样构建一个轮子,它可以工作。但是 sdist 不起作用:

python: can't open file 'setup.py': [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)

那么您应该如何使用 setuptools实际构建 .tar.gz 文件?什么是面向用户的创建 sdist 的工具?我不想更改构建后端。看起来其他打包工具都编写了自己的构建入口点,但我认为在元数据中定义声明性构建系统的全部意义在于,您不必亲自动手构建系统,了解每个不同的打包工具期望被调用或必须进入解释器并手动调用 Python API。但是构建系统要求的 PEP 现在已经超过 2 年了。我在这里遗漏了一些明显的东西吗?

如何在不使用setup.py文件的情况下构建源代码分发?

Pau*_*aul 20

这是一个有点争议的话题,目前的答案是,没有一种工具是每个人都同意的构建源代码发行版的“正确方法”,也没有一种工具是什么。您可以在 Python Packaging discourse 上看到有关它的长篇幅

我不愿提供太多耐用格式的包装建议,因为沙子总是在变化,但截至 2019 年 11 月,setup.py sdist并未被弃用,但它确实具有 PE​​P 517 和 PEP 518 旨在修复的所有缺点——即你有自己创建构建环境(并了解所有构建依赖项),并且它适用于 setuptools/distutils 及其等效项。

这不是“官方”建议,而是当前(2020 年 12 月)的最佳替代品,setup.py sdist并且setup.py bdist_wheel正在使用pypa-build。安装一次

pip install build
Run Code Online (Sandbox Code Playgroud)

并用作

python -m build --sdist --wheel
Run Code Online (Sandbox Code Playgroud)

这同时构建了源代码分发和轮子。这就是我构建 PEP 517 兼容包的方式。

这要求您的项目有pyproject.toml,pyproject.toml必须有build-system.requiresbuild-system.build-backend密钥,但它适用于具有 PE​​P 517 兼容后端(包括flit)的任何项目。

其他工具

为什么不使用flitpoetryhatch?这些工具都可供想要使用它们的人使用,但它们不是这个问题的答案。这个问题是询问setuptools使用声明性setup.cfg格式构建的项目。既不作为通用 PEP 517 构建前端,flit也不poetry作为通用的 PEP 517 构建前端,因此它们仅用作使用各自后端的项目的构建命令。

我不熟悉不够用hatch说它是否能与后端管理项目比setuptools的,但(再次,为2019年11月),它是不是一个PEP 517前端,也不会工作,如果你没有a setup.py(它会引发错误“无法打开文件 setup.py”,并且会忽略您的pyproject.toml文件)。

  • 因为在我看来,这是一次成功的实验(我和许多其他 PyPA 人都使用它),因为它具有适合这项工作的正确语义,而且因为它是我所知道的唯一通用 PEP 517 构建前端。flit 和诗歌是垂直整合的,因为他们希望你使用他们的后端。孵化似乎还能做很多其他事情。`pep517.build` 是一个专门为此目的而构建的简单工具。 (2认同)