find_packages python packaging setuptools egg

python - setuptools find_packages



¿Cómo puedo hacer que setuptools ignore el inventario de subversion? (5)

Crea un archivo MANIFEST.in con:

recursive-exclude . # other MANIFEST.in commands go here # to explicitly include whatever files you want

Consulte http://docs.python.org/distutils/commandref.html#sdist-cmd para ver la sintaxis MANIFEST.in.

Al empaquetar un paquete de Python con un setup.py que usa las herramientas de configuración:

from setuptools import setup ...

La distribución de fuente creada por:

python setup.py sdist

no solo incluye, como de costumbre, los archivos especificados en MANIFEST.in, sino que también, de forma gratuita, incluye todos los archivos que Subversion enumera como versión controlada bajo el directorio del paquete. Esto es muy molesto. No solo hace que sea difícil ejercer ningún tipo de control explícito sobre qué archivos se distribuyen con mi paquete, sino que significa que cuando compilo mi paquete después de una "exportación svn" en lugar de una "verificación svn", el contenido de mi el paquete puede ser bastante diferente, ya que sin los metadatos .svn, setuptools hará diferentes elecciones sobre qué incluir.

Mi pregunta: ¿cómo puedo desactivar este comportamiento terrible, para que "setuptools" trate mi proyecto de la misma manera si estoy usando Subversion, o el control de versión del que nunca se ha oído hablar, o un árbol desnudo creado con "svn exportar" que yo? ¿He creado al final de mi proyecto para asegurarme de que se construya limpiamente en algún lugar además de mi directorio de trabajo?

Lo mejor que he logrado hasta ahora es un parche de mono feo:

from setuptools.command import sdist del sdist.finders[:]

Pero esto es Python, no la jungla, así que, por supuesto, quiero una solución mejor que no involucre a los monos. ¿Cómo puedo dominar las herramientas de configuración, desactivar su magia y hacer que se comporte de manera sensata al observar las reglas visibles y predecibles en mi MANIFEST.py?


Probablemente la respuesta está en tu setup.py. ¿Utiliza find_packages? Esta función utiliza por defecto el VCS (por ejemplo, subversion, hg, ...). Si no te gusta, simplemente escribe una función Python diferente que recopile solo las cosas que deseas.


Probablemente quieras algo como esto:

from distutils.core import setup def packages(): import os packages = [] for path, dirs, files in os.walk("yourprogram"): if ".svn" in dirs: dirs.remove(".svn") if "__init__.py" in files: packages.append(path.replace(os.sep, ".")) return packages setup( # name, version, description, etc... packages = packages(), # pacakge_data, data_files, etc... )


Sé que sabes mucho de esto, Brandon, pero intentaré dar una respuesta tan completa como pueda (aunque no soy un experto en herramientas de configuración) en beneficio de los demás.

El problema aquí es que setuptools implica una gran cantidad de magia negra, incluido el uso de un punto de entrada llamado setuptools.file_finders donde puede agregar complementos para encontrar archivos para incluir. Sin embargo, estoy completamente perdido en cuanto a cómo QUITAR los complementos ...

  • Solución rápida: svn exporte su paquete a un directorio temporal y ejecute el archivo setup.py desde allí. Eso significa que no tiene svn, por lo que el buscador de svn no encuentra archivos para incluir. :)

  • Solución más larga: ¿Realmente necesita herramientas de configuración? Setuptools tiene muchas características, por lo que la respuesta es sí, pero principalmente son dependencias (para que sus dependencias se instalen con easy_install), paquetes de espacio de nombres (foo.bar) y puntos de entrada. Los paquetes de espacio de nombres también se pueden crear sin herramientas de configuración. Pero si no usas ninguno de estos, podrías salirte con solo usar distutils.

  • Solución fea: el monkeypatch que le dio a sdist en su pregunta, que simplemente hace que el complemento no tenga ningún buscador, y salga rápidamente.

Entonces, como ven, esta respuesta, aunque tan completa como puedo hacerlo, sigue siendo vergonzosamente incompleta. Realmente no puedo responder tu pregunta, aunque creo que la respuesta es "No puedes".


Yo diría que el comportamiento por defecto sdist es correcto. Cuando esté creando una distribución de origen , esperaría que contuviera todo lo que está registrado en Subversion. Por supuesto, sería bueno poder anularlo limpiamente en circunstancias especiales.

Compara sdist con bdist_egg; Apuesto que solo los archivos que se especifican explícitamente se incluyen.

Hice una prueba simple con tres archivos, todos en svn. Vacíe dummy.lkj y foobar.py y con setup.py con este aspecto:

import setuptools setuptools.setup(name=''foobar'', version=''0.1'', py_modules=[''foobar''])

sdist crea un tarball que incluye dummy.lkj. bdist_egg crea un huevo que no incluye dummy.lkj.