自 2022 年中期以来,现在可以摆脱
setup.py
、setup.cfg
,转而使用 pyproject.toml
。可编辑安装适用于最新版本的 setuptools 和 pip,甚至官方打包教程也从 setup.py
切换到 pyproject.toml
。
但是,有关
requirements.txt
的文档似乎也已被删除,我想知道现在将固定需求放在哪里?
回顾一下:过去的常见做法是将依赖项(没有版本固定)放在
setup.py
中,以避免当此软件包与需要相同依赖项但版本要求冲突的其他软件包一起安装时出现问题。对于打包库,setup.py
通常就足够了。
对于部署(即非库),您通常还提供具有版本固定依赖项的
requirements.txt
。因此,您不会意外地获得该包经过测试的最新和最好的依赖项的确切版本。
所以我的问题是,有什么改变吗?当与
requirements.txt
一起使用时,您是否仍然将固定的需求放在pyproject.toml
中?或者有多余的部分吗
为了那个pyproject.toml
?某处有相关文档吗?
引用自这里
我当前的假设是:[...]您将(大部分未固定的)依赖项放入 pyproject.toml 而不是 setup.py,因此您的库可以作为其他内容的依赖项安装,而不会因为解决版本问题而造成太多麻烦限制。
最重要的是,对于“可部署的应用程序”(由于缺乏更好的术语),您仍然希望维护一个具有精确版本固定的单独的requirements.txt。
这已得到 Python 包装权威 (PyPA) 成员的确认,并且 PyPA 建议的说明应在某个时候进行相应更新。
所以我的问题是,有什么改变吗?与 pyproject.toml 一起使用时,您是否仍然将固定需求放在requirements.txt中?或者 pyproject.toml 中有一个额外的部分吗?某处有相关文档吗?
什么都没有改变。固定依赖项不属于项目的打包元数据,这意味着固定依赖项不属于
dependencies
文件的 [project]
部分的 pyproject.toml
列表。截至今天,我知道 pyproject.toml
中没有 标准化 部分用于固定依赖项。这个文档尽管已经过时了,但其精神仍然适用:“抽象依赖项”属于包元数据(例如在[project]
的pyproject.toml
部分)和“具体依赖项”可以在一个 requirements.txt
文件(如果需要)(或者在任何其他具有类似用途的文件中,例如 Poetry 的 poetry.lock
或 Pipenv 的 Pipfile.lock
,仅举其中两个,具体取决于项目的开发工作流程)和工具)。
背景
我发现这个问题“使用 pyproject.toml 时是否仍然需要requirements.txt”,并且与上述问题描述的用例相比,有一个“不同的用例”。我决定添加这个答案作为“长评论”,而不是打开一个具有相同标题的额外问题,以支持类似情况下的用户。 在我的用例中我不将代码安装为库/包
,而是将其用作应用程序。
可以通过使用 hatchling
build-backend
并在
dependencies
和
[project.optional-dependencies]
部分中定义依赖项来从 pyproject.toml 安装依赖项。
安装依赖项
pip install .[dev]
pyproject.toml
中相应部分的示例:
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[project]
name = 'my_dummy_project_name'
version = '0.0.1'
requires-python = ">=3.11.0"
dependencies = [
'cryptography==41.0.1',
]
[project.optional-dependencies]
lining = [
'pylint==2.17.4'
]
formatting = [
'black[d]==23.3.0'
]
dev = ['my_dummy_project_name[linting, formatting]']
相关:
https://github.com/pypa/packaging.python.org/issues/685
https://peps.python.org/pep-0631/
https://stackoverflow.com/a/75503961/2876079
https://pip.pypa.io/en/stable/cli/pip_install/#options
https://github.com/winpython/winpython/issues/1128
我建议切换到