Problemas de setuptools – excluyendo paquetes, incluyendo archivos de datos

Soy bastante nuevo en setuptools. He visto algunas preguntas similares y me vuelve un poco loco que parezca seguir los consejos que he visto, pero setuptools todavía hace algo diferente a lo que quiero.

Aquí está la estructura de mi proyecto:

. .. package1/ __init__.py abc.py ... tests/ __init__.py test_package1.py LICENSE README.md RELEASE setup.py 

Y aquí está el contenido de mi setup.py:

 #!/usr/bin/env python import os #from distutils.core import setup from setuptools import setup, find_packages setup( name='package1', version='1.1', test_suite="tests", packages=find_packages(exclude=['tests']), include_package_data=True, package_data = { '': ['LICENSE', 'README.md5', 'RELEASE'] }, ) 

Además, en mi archivo de manifiesto tengo:

 include LICENSE include RELEASE include README.md 

Construyo el alquitrán con:

 python setup.py sdist 

Quiero:

  1. Excluir el directorio de tests de la distribución de origen;
  2. Tenga los archivos de LICENCIA, README.md, LIBERACIÓN en el directorio de paquetes de sitios, ya sea en el nivel superior o dentro del directorio de paquetes1 (en este punto, aceptaré cualquiera de los dos).

En su lugar, esto es lo que sucede:

  1. tests directorio de tests permanece en el archivo tar creado y se instala en los paquetes de sitio;
  2. Los archivos se copian en el archivo, pero no se instalan en el directorio del paquete empaquetado en el sitio.

Me he quedado sin ideas, ¿puede alguien explicarme qué estoy haciendo mal y cómo solucionarlo?

Debería crear un nuevo archivo llamado MANIFEST.in en el nivel raíz de su paquete, luego siga estas instrucciones:

  1. Para controlar qué archivos terminan en su archivo tar, cree un nuevo archivo llamado MANIFEST.in en el nivel raíz de su paquete. Por ejemplo, puede excluir directorios enteros de su distribución, utilizando recursive-exclude en el archivo MANIFEST.in . En su caso, necesita que su archivo MANIFEST.in contenga:

     recursive-exclude tests * 
  2. No es común incluir README y otros archivos en el directorio de paquetes de sitio, pero si realmente lo desea, vaya dentro de package1 y cree enlaces simbólicos a los archivos que desea incluir:

     cd package1 ln -s ../LICENSE ln -s ../README.md ln -s ../RELEASE 

    Luego cambia la siguiente línea en tu setup.py:

     package_data = { '': ['LICENSE', 'README.md', 'RELEASE'] 

    a:

     package_data = { 'package1': ['LICENSE', 'README.md', 'RELEASE'] 

find_packages usa fnmatchcase para su filtrado de exclusión. Puede probar si su patrón de exclusión coincide con el nombre de un paquete de la siguiente manera:

 >>> from fnmatch import fnmatchcase >>> fnmatchcase('my.package.name.tests', 'tests') False 

Suponiendo que todas las pruebas en su proyecto viven en nombres de paquetes que terminan en tests o subpaquetes de esos paquetes, lo siguiente debería ser suficiente para excluir todo el código de prueba:

 setup( name='package1', version='1.1', packages=find_packages(exclude=['tests', '*.tests', '*.tests.*']), ) 

Para excluir también la carpeta de tests de las distribuciones de origen, agregue lo siguiente a MANIFEST.in:

 recursive-exclude tests * 

Si tu estructura es verdadera:

  1. La carpeta de pruebas no es un paquete (no tiene el archivo .py de inicio ), por lo que find_package no lo excluye.
  2. include_package_data = True significa que todos los archivos versionados se incluirán si no se excluyen explícitamente.

así que: intente una prueba de exclusión / * en su MANIFEST.in

Espero que haya ayudado

MANIFEST.in se encargaría de ello.

 prune tests/ include LICENSE README.md RELEASE 

Si tiene archivos estáticos para agregar, agréguelos con

 ... recursive-include package1/static * 

Estaba probando todo y nada parecía funcionar, hasta que eliminé el directorio de build (después de ver otra respuesta mencionando el *.egg-info/ ) y finalmente funcionó. python setup.py clean --all debería hacer el trabajo.