Со следующей структурой пакета
.
├── 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
файла?
pep517.build
что подразумевается только в качестве эксперимента, временной опоры, когда появляются такие продуктивные инструменты, как порхание, поэзия, люк и, возможно, даже больше?pep517.build
это простой инструмент, созданный именно для этой цели.pep517.build
был одним из них. Но не совсем, это на самом деле сборка. Также люк не готов PEP517, как я вижу сейчас.Там нет ничего "очевидного", когда дело доходит до упаковки Python. Действительно, на данный момент, по крайней мере, если вы используете distutils / setuptools, необходимо создать (почти) пустой
setup.py
файл, даже если вы используете полностью декларативныйsetup.cfg
:Я также рекомендую
chmod +x setup.py
.В этом случае вы просто пишете «точку входа» в систему сборки самостоятельно, и
setup()
это простоmain()
функция для нее - но теперь вместо этогоsetup()
можно прочитать все аргументы, которые традиционно передавалисьsetup.cfg
.Теперь вы все еще можете использовать,
setup.py sdist
если хотите сделать архив с исходным кодом:./setup.py sdist
Вы также можете попробовать одну из альтернативных систем сборки, которые включены через
pyproject.toml
, например, Flit .источник
setup.cfg
означает, чтоsetup.py
больше нет необходимости использовать setuptools, что не соответствует действительности. То, что название вопроса вводит в заблуждение, не означает, что ответ таков. Они написали в основной части вопроса «Так как же вам на самом деле собрать файл .tar.gz с помощью setuptools ?» который отвечает правильно.