繁体   English   中英

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

[英]How do I read project dependencies from pyproject.toml from my setup.py, to avoid duplicating the information in both files?

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

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

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

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

据我所知,公文包实际上与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 有多稳定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM