自2022年年中以来,现在可以摆脱setup.py
、setup.cfg
,转而支持pyproject.toml
。可编辑安装适用于最新版本的setuptools和pip,甚至官方的打包教程也从setup.py
切换到了pyproject.toml
。
然而,关于requirements.txt
的文档似乎也被删除了,我想知道现在把固定的需求放在哪里?
作为复习:将依赖项(无版本固定)放在setup.py
中曾经是一种常见的做法,以避免在安装此软件包时与其他需要相同依赖项但版本要求冲突的软件包一起出现问题。对于封装库,setup.py
通常就足够了。
对于部署(即非库),您通常还提供了带有版本固定依赖项的requirements.txt
。因此,您不会意外地获得该包测试过的最新和最棒的依赖项的确切版本。
所以我的问题是,有什么变化吗?当与pyproject.toml
一起使用时,您是否仍将固定需求放在requirements.txt
中?或者有多余的部分吗对于pyproject.toml
中的那个?有关于这方面的文件吗?
从这里引用
我目前的假设是:[…]你把你的(大部分是未固定的)依赖项放在pyproject.toml而不是setup.py中,这样你的库就可以作为其他东西的依赖项安装,而不会因为解决版本限制的问题而引起太多麻烦。
除此之外,对于";可部署应用程序";(因为没有更好的术语),您仍然希望维护一个单独的requirements.txt,并使用精确的版本固定。
这已经得到Python包装管理局(PyPA)成员的确认,PyPA建议的澄清应该在某个时候相应地更新。
这是pyproject.toml
的pip文档
。。。该文件包含构建系统需求和信息,pip使用这些需求和信息来构建包。
所以这不是正确的位置。查看侧栏,我们可以看到CCD_;旧的";requirements.txt
文件
所以我的问题是,有什么变化吗?当与pyproject.toml一起使用时,您是否仍将固定的需求放在requirements.txt中?或者在pyproject.toml中有一个额外的部分吗?有关于这方面的文件吗?
没有任何更改。固定的依赖项不属于项目的打包元数据,这意味着固定的依赖性不属于pyproject.toml
文件的[project]
部分的dependencies
列表。截至目前,据我所知,pyproject.toml
中没有标准化部分用于固定依赖关系。这份文件尽管已经过时,但仍然适用于以下精神:">抽象依赖性";属于包元数据中(例如在pyproject.toml
的[project]
部分中)具体依赖性";如果需要,可以在requirements.txt
文件中列出(或在任何其他具有类似用途的文件中列出,如Poetry的poetry.lock
或Pipenv中的Pipfile.lock
,仅列出其中两个,具体取决于项目的开发工作流程和工具)。
上下文
我发现了这个问题">使用pyproject.toml时是否仍然需要requirements.txt;并且与上述问题所描述的用例相比具有不同的用例。我没有用同样的标题打开一个额外的SO问题,而是决定添加这个答案作为一种";长评论";,支持类似情况下的用户。
在我的用例中,我不将代码安装为库,而是将其用作应用程序。
通过使用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_application_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_application_name[linting, formatting]']
相关:
https://hatch.pypa.io/latest/meta/faq/#libraries-与应用
https://peps.python.org/pep-0665/
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
如何编写一个可以安装软件包的最低限度工作的pyproject.toml文件?
我建议切换到poetry
,它比用于依赖关系管理的标准pip
要好得多。因为它使用pyproject.toml
,所以依赖项和配置都在一个地方,所以管理更容易