python - 如何从 setup.py 中读取来自 pyproject.toml 的项目依赖项,以避免在两个文件中重复信息?
问题描述
我们正在升级以使用BeeWare 的 Briefcase 0.3.1进行打包,它使用pyproject.toml
而不是setup.py
指定如何打包,包括要包含在包中的依赖项。
pyproject.toml
这是for公文包的最小示例:
[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来构建和安装项目,同时注意正确设置包含setuptools和toml的构建环境。
我想也可以让公文包处理pyproject.toml
文件的解析(也许用briefcase.config.parse_config(...)
),但它没有记录,所以我不知道这些 API 有多稳定。
推荐阅读
- python - 按索引对字符串列表进行排序
- wpf - 如何在 WPF 中制作条件扩展器
- javascript - 如何在顶部显示所有条形值的总数 - Highcharts 列 - 反应 highhcharts
- powershell - Runas-Command 中的 Powershell 数组
- php - 同时运行的 cron 作业记录处理组合
- java - 如何在 Spring Boot JUnit 5 中对 oracle 存储过程调用进行单元测试
- c# - ComboBox DataSource 没有按我的预期工作
- azure - 更新存储帐户时创建一个事件,它将触发一个事件并在存储队列 Azure 门户中发送一条消息
- java - Java 变量到时间字符串的转换
- karate - 如何验证并关闭使用空手道 UI 单击链接后出现的新选项卡?