Con la siguiente estructura de paquete
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── setup.py
Contenido de setup.py
from setuptools import setup
setup()
Contenido de setup.cfg
[metadata]
name = my_package
version = 0.1
[options]
packages = find:
Puedo construir una rueda o una distribución de origen para my_package
esto
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
Pero de acuerdo con el mantenedor de setuptools , una configuración de compilación declarativa es ideal y usar una compilación imperativa será un olor a código. Entonces reemplazamos setup.py
con pyproject.toml
:
.
├── my_package
│ └── __init__.py
├── setup.cfg
└── pyproject.toml
Contenido de pyproject.toml
[build-system]
build-backend = "setuptools.build_meta"
requires = ["setuptools", "wheel"]
Y aún puede construir una rueda de la misma manera que antes, funciona. Pero sdist no funciona:
python: can't open file 'setup.py': [Errno 2] No such file or directory
Entonces, ¿cómo debería realmente construir el archivo .tar.gz usando setuptools ? ¿Cuál es la herramienta orientada al usuario para crear sdist? No quiero cambiar el backend de compilación. Parece que otras herramientas de empaque escriben sus propios puntos de entrada de compilación, pero pensé que el objetivo de definir un sistema de compilación declarativo en los metadatos era para que no tuvieras que ponerte en práctica con el sistema de compilación, aprendiendo cómo cada uno diferente herramienta de empaquetado espera ser invocada o tener que ingresar al intérprete y llamar a una API de Python manualmente. Pero el PEP para los requisitos del sistema de construcción tiene más de 2 años. ¿Me estoy perdiendo algo obvio aquí?
¿Cómo construir una distribución fuente sin usar el setup.py
archivo?
fuente
pep517.build
que solo se entiende como un experimento, una muleta temporal cuando hay herramientas productivas como revoloteo, poesía, escotilla y probablemente aún más?pep517.build
es una herramienta simple creada exactamente para este propósito.pep517.build
era uno de ellos. Pero en absoluto, en realidad es un front-end de compilación. Además, la escotilla no está lista para PEP517 como veo ahora.No hay nada "obvio" cuando se trata de empaquetado de Python. De hecho, por el momento, al menos si está usando distutils / setuptools, es necesario crear un
setup.py
archivo (casi) vacío , incluso si está usando un declarativo completosetup.cfg
:Yo tambien lo recomiendo
chmod +x setup.py
.En este caso, solo está escribiendo el "punto de entrada" en el sistema de compilación, y
setup()
es solo lamain()
función para ello, pero ahorasetup()
se pueden leer todos los argumentos que tradicionalmente se pasaron asetup.cfg
.Ahora aún puede usar
setup.py sdist
si desea hacer un tarball fuente:./setup.py sdist
También puede probar uno de los sistemas de compilación alternativos que están habilitados a través de
pyproject.toml
, como Flit .fuente
setup.cfg
significa quesetup.py
ya no es necesario usar setuptools, lo cual no es cierto. El hecho de que el título de la pregunta sea engañoso no significa que la respuesta lo sea. Escribieron en el cuerpo de la pregunta "Entonces, ¿cómo debería realmente construir el archivo .tar.gz usando setuptools ?" que esto responde correctamente.