Как построить исходный дистрибутив без использования файла setup.py? - PullRequest
3 голосов
/ 07 ноября 2019

Со следующей структурой пакета

.
├── my_package
│   └── __init__.py
├── setup.cfg
└── setup.py

Содержимое setup.py

from setuptools import setup
setup()

Содержимое setup.cfg

[metadata]
name = my_package
version = 0.1

[options]
packages = find:

Я могу построить колесо илиисходный дистрибутив для my_package, подобный этому

pip wheel --no-deps -w dist .
# generates file ./dist/my_package-0.1-py3-none-any.whl
python setup.py sdist
# generates file ./dist/my_package-0.1.tar.gz

Но, по словам сопровождающего setuptools , декларативная конфигурация сборки идеальна, и использование принудительной сборки будет пахнуть кодом. Таким образом, мы заменим setup.py на pyproject.toml:

.
├── my_package
│   └── __init__.py
├── setup.cfg
└── pyproject.toml

Содержимое pyproject.toml

[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]

И вы все равно можете построить колесо так же, как и раньше, оно работает,Но sdist не работает:

python: can't open file 'setup.py': [Errno 2] No such file or directory

Так как же на самом деле построить файл .tar.gz с помощью setuptools ? Что такое инструмент для создания sdist? Я не хочу менять бэкэнд сборки. Похоже, что все другие инструменты упаковки пишут свои собственные точки входа в сборку, но я думал, что весь смысл определения декларативной системы сборки в метаданных заключается в том, чтобы вам не приходилось практиковаться в системе сборки, изучая, как каждыйдругой инструмент упаковки ожидает вызова или необходимости входить в интерпретатор и вызывать Python API вручную. Но PEP для требований к системе сборки уже более 2 лет. Я что-то упускаю здесь очевидное?

Как создать исходный дистрибутив без использования setup.py файла?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

Это несколько спорная тема, и ответ на данный момент заключается в том, что нет единого инструмента, с которым все согласны, является «правильный путь» для создания исходных дистрибутивов, и каким бы он ни был. Вы можете увидеть длинную ветку об этом в дискурсе Python Packaging .

Я не решаюсь давать слишком много советов по упаковке в прочных форматах, потому что пески постоянно меняются, но по состоянию на ноябрь 2019 года,setup.py sdist является не устаревшим, но имеет имеет все недостатки, которые PEP 517 и PEP 518 должны были исправить, а именно то, что вы должны создать среду сборки самостоятельно (и знать,о всех зависимостях сборки), и он только работает с setuptools / distutils и их эквивалентами.

Это не «официальная» рекомендация, а лучшая на данный момент замена для setup.py sdist иsetup.py bdist_wheel вызывает версию командной строки pep517. Замена для sdist:

python -m pep517.build --source .

. Вы можете одновременно создать колесо и распределение источника следующим образом:

python -m pep517.build --source --binary .

Вот как я строю свой PEP 517-совместимые пакеты.

Для этого требуется, чтобы в вашем проекте были pyproject.toml, а для pyproject.toml должны быть ключи build-system.requires и build-system.build-backend, но он будет работать для любого проекта с PEP 517-совместимымбэкэнд (включая flit).

Другие инструменты :

Почему бы не использовать flit или poetry или hatch? Все эти инструменты доступны для тех, кто хочет их использовать, но они не являются ответом на этот вопрос . Этот вопрос задает вопросы о проектах, построенных с setuptools, которые используют декларативный формат setup.cfg. Ни flit, ни poetry не действуют как универсальные интерфейсы сборки PEP 517, и поэтому они только не работают в качестве команд сборки для проектов, использующих их соответствующие серверные части.

Я недостаточно знакомс hatch, чтобы сказать, может ли он управлять проектами с бэкэндами , отличными от setuptools, но (опять же, по состоянию на ноябрь 2019 года), это не фронтэнд PEP 517, ион не будет работать, если у вас нет setup.py (это вызовет ошибку «не могу открыть файл setup.py», и он проигнорирует ваш pyproject.toml файл).

0 голосов
/ 07 ноября 2019

Нет ничего "очевидного", когда дело доходит до упаковки Python. Действительно, в настоящее время, по крайней мере, если вы используете distutils / setuptools, необходимо создать (почти) пустой setup.py файл, даже если вы используете полностью декларативный setup.cfg:

#!/usr/bin/env python
from setuptools import setup
setup()

Я также рекомендую chmod +x setup.py.

. В этом случае вы просто записываете «точку входа» в систему сборки самостоятельно, а setup() - это просто функция main() для нее - но теперьвсе аргументы, которые традиционно передавались в setup(), могут быть прочитаны вместо setup.cfg.

Теперь вы все равно можете использовать setup.py sdist, если хотите создать архив с исходным кодом:

./setup.py sdist

Вы также можете попробовать одну из альтернативных систем сборки, которые активируются через pyproject.toml, например, Flit .

...