如何从我的 setup.py 从 pyproject.toml 读取项目依赖项,以避免重复两个文件中的信息?



我们正在升级以使用BeeWare 的公文0.3.1进行打包,它使用pyproject.toml而不是setup.py来指定如何打包,包括要包含在包中的依赖项。

下面是公文包pyproject.toml的最小示例:

[tool.briefcase.app.exampleapp]
formal_name = "exampleapp"
description = "something"
requires = ['PyQt5', 'qtconsole']
sources = ['exampleapp']

我们希望从setup.py访问需求列表,因此我们不必在两个文件中复制它,并使它们保持同步。我们还没有准备好退出设置工具,这只是为了打包。另一种选择当然是让setup.py自动生成pyproject.toml文件,但这似乎与PEP 518的意图有点倒退。

这个答案可能已经过时了。我现在没有时间调查。我建议查看公文包资源以获取更多最新信息。例如,文档的这一部分可能是相关的:https://briefcase.readthedocs.io/en/latest/reference/configuration.html#pep621-compatibility


据我所知,公文包实际上并不兼容PEP 517(至少默认情况下不兼容(。它使用pyproject.toml文件,但不填充[build-system]部分,因此应该可以在该文件中设置实际的PEP 517构建后端而不会引起冲突。

pyproject.toml

[build-system]
build-backend = 'setuptools.build_meta'
requires = [
'setuptools',
'toml',
]
[tool.briefcase.app.exampleapp]
formal_name = 'exampleapp'
description = 'something'
requires = ['PyQt5', 'qtconsole']
sources = ['exampleapp']

setup.py

#!/usr/bin/env python3
import pathlib
import pkg_resources
import setuptools
import toml
def _parse_briefcase_toml(pyproject_path, app_name):
pyproject_text = pyproject_path.read_text()
pyproject_data = toml.loads(pyproject_text)
briefcase_data = pyproject_data['tool']['briefcase']
app_data = briefcase_data['app'][app_name]
setup_data = {
'name': pkg_resources.safe_name(app_data['formal_name']),
'version': briefcase_data['version'],
'install_requires': app_data['requires'],
# ...
}
return setup_data
def _setup():
app_name = 'exampleapp'
pyproject_path = pathlib.Path('pyproject.toml')
setup_data = _parse_briefcase_toml(pyproject_path, app_name)
setuptools.setup(**setup_data)
if __name__ == '__main__':
_setup()

然后,pip和其他与PEP 517兼容的前端应该能够通过委派给 setuptools 来构建和安装项目,同时注意正确设置包含setuptoolstoml的构建环境。

我想也可以让公文包处理pyproject.toml文件的解析(可能带有briefcase.config.parse_config(...)(,但它没有记录在案,所以我不知道这些 API 有多稳定。

相关内容

  • 没有找到相关文章

最新更新