Как мне прочитать зависимости проекта из pyproject.toml из моего setup.py, чтобы избежать дублирования информации в обоих файлах?

Мы обновляемся, чтобы использовать BeeWare's Briefcase 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.


person Dybber    schedule 13.06.2020    source источник
comment
Я мало что знаю о brefcase, но могу предположить, что setup.py файл вообще не требуется. Возможно, там больше шансов: beeware.org/community/getting-help   -  person sinoroc    schedule 14.06.2020
comment
Если вы хотите сохранить и setup.py, и pyproject.toml, я думаю, вы могли бы написать немного кода в setup.py, который анализирует файл Toml, но тогда setup.py нужна внешняя зависимость от библиотеки Toml (поскольку нет Анализатор Toml в стандартной библиотеке Python). Кажется, что это может быть как-то осуществимо (возможно, с некоторым компромиссом).   -  person sinoroc    schedule 14.06.2020


Ответы (1)


Насколько я могу судить, brefcase на самом деле не совместим с 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.

Я предполагаю, что также можно было бы позволить brefcase обрабатывать файл pyproject.toml (возможно, вместе с briefcase.config.parse_config(...)), но это не задокументировано, поэтому я не знаю, насколько стабильны эти API.

person sinoroc    schedule 14.06.2020