¿Los proyectos de Python necesitan un MANIFEST.in, y qué debería haber en él?

120

La guía "Python Distribute" (estaba en python-distribute.org, pero ese registro ha caducado) me dice que incluya doc/txtarchivos y los .pyarchivos están excluidos en el MANIFEST.inarchivo.

La documentación de sourcedist me dice que solo sdist usa MANIFEST.iny solo incluye el archivo que usted especifica y para incluir .pyarchivos. También me dice que use: python setup.py sdist --manifest-onlypara generar un MANIFEST, pero Python me dice que esto no existe

Aprecio que estos son de diferentes versiones de Python y el sistema de distribución está en un completo desastre, pero suponiendo que estoy usando Python 3 y setuptools(el nuevo que incluye distribuir pero ahora se llama herramientas de configuración, no las herramientas de configuración antiguas que estaban obsoletas solo para distribuir herramientas volver a distribuir y distribuir renombrado a setuptools .....)

y sigo la estructura de carpetas y el setup.pyarchivo "estándar" ,

  1. ¿Necesito un MANIFEST.in?
  2. ¿Qué debería haber en él?
  3. ¿Cuándo se convertirán todos estos diferentes métodos y sistemas de paquetes en un solo proceso simple?
Neil Walker
fuente

Respuestas:

117

Re: "¿Necesito un MANIFEST.in?

No, no tienes que usar MANIFEST.in. Ambos, distutilsy setuptoolsestán incluidos en el paquete de distribución de origen todos los archivos mencionados en setup.py: módulos, archivos de paquete de python README.txty test/test*.py. Si esto es todo lo que desea tener en el paquete de distribución, no es necesario que utiliceMANIFEST.in .

Si desea manipular (agregar o eliminar) archivos predeterminados para incluir, debe usar MANIFEST.in .

Re: ¿Qué debería haber en él?

El procedimiento es sencillo:

  1. Asegúrate de setup.pyincluir (mediante setupargumentos) todos los archivos que consideres importantes para que el programa ejecute (módulos, paquetes, scripts ...)

  2. Aclare si hay algunos archivos para agregar o algunos archivos para excluir. Si no se necesita ninguno, entonces no es necesario usarlo MANIFEST.in.

  3. Si MANIFEST.ines necesario, créelo. Por lo general, agrega tests*/*.pyarchivos, README.rstsi no los usa README.txt, docsarchivos y posiblemente algunos archivos de datos para el conjunto de pruebas, si es necesario.

Por ejemplo:

include README.rst
include COPYING.txt

Para probarlo, ejecute python setup.py sdisty examine el tarball creado bajo dist/.

¿Cuándo todos estos diferentes sistemas de paquetes ...

Comparar la situación actual y la de hace 2 años, la situación es mucho mejor, setuptoolses el camino a seguir. Puede ignorar el hecho, distutilsestá un poco roto y es una base de bajo nivel por setuptoolscomosetuptools se encargará de esconderte estas cosas.

EDITAR : Los últimos proyectos que utilizo pbrpara construir paquetes de distribución con tres líneas setup.pyy el resto en setup.cfgy requirements.txt. No hay necesidad de preocuparse por MANIFEST.inotras cosas extrañas. Aunque el paquete merecería un poco más de documentación. Ver http://docs.openstack.org/developer/pbr/

Jan Vlcinsky
fuente
1
En mi experiencia limitada, parece que si desea incluir archivos que no están dentro de un módulo de Python (dir con init .py), debe usar MANIFEST.in y usar el comando sdist(significa: distribución de fuente ). Si considera que bdisty bdist_wheelson binarios y solo están destinados a instalarse en su ruta de Python, esto tiene sentido. (¿Dónde irían estos archivos y directorios que no son módulos? ¿En /usr/local/lib/python2.7/dist-packages/? Seguramente no.) Pero vale la pena mencionarlo ya que es confuso ver el archivo creado y no incluir los archivos.
Bruno Bronosky
7
Para evitar lo inevitable package_datay las data_filesrecomendaciones, que están fuera de alcance, continuaré. package_dataenumera el archivo que se instala con su paquete en el dist-packages/yourpackageque se habría omitido porque no tiene un nombre * .py. data_filesenumera los archivos que se instalan fuera de su paquete. Cada entrada especifica una ruta de destino que tiene como prefijo sys.prefixsi es relativa o se crea directamente (si los permisos lo permiten) si comienza con /.
Bruno Bronosky
2
@JanVlcinsky es importante saber qué está y [lo que es más importante] no está incluido en los diferentes formatos de distribución. Tengo un proyecto público que solo distribuyo a través de la distribución de origen porque incluyo un archivo boto.sample.cfg (que contiene una credencial de AWS IAM falsa) fuera del paquete (en la raíz) y las distribuciones binarias no lo incluirán. Hago compilaciones binarias privadas para implementar en producción que tienen data_files = [('/ etc /', ['boto.cfg'])]. Si desea distribuir archivos que no son py, debe saber cómo funcionan estas cosas.
Bruno Bronosky
2
@MichaelGoerz Honestamente, no deberían. Esta respuesta es antigua y sugerir también pbres una mala idea.
Arne
1
@Amigo, estoy de acuerdo, las cosas siguieron adelante. Actualmente estoy convirtiendo la mayoría de mis proyectos de pbr a poesía
Jan Vlcinsky
7

Pregunta antigua, respuesta nueva:

No, no es necesario MANIFEST.in. Sin embargo, para llegar setuptoolsa hacer lo que (normalmente) quieres decir, necesitas usar el setuptools_scm, que asume el papel de MANIFEST.inen 2 lugares clave:

  • Garantiza que todos los archivos relevantes estén empaquetados al ejecutar el sdistcomando (donde todos los archivos relevantes se definen como "todos los archivos bajo control de fuente")
  • Cuando se usa include_package_datapara incluir datos del paquete como parte de buildo bdist_wheel. (nuevamente: archivos bajo control de fuente)

La comprensión histórica de MANIFEST.ines: cuando no tiene un sistema de control de fuente, necesita algún otro mecanismo para distinguir entre "archivos fuente" y "archivos que se encuentran en su directorio de trabajo". Sin embargo, su proyecto está bajo control de fuente (¿verdad?), Por lo que no es necesario MANIFEST.in. Más información en este artículo .

Klaas van Schelven
fuente