2011-12-19 8 views
14

Soy bastante nuevo en setuptools. He visto algunas preguntas similares y me vuelve un poco loco que parezca seguir los consejos que vi, pero las herramientas de configuración todavía hacen algo diferente de lo que quiero.problemas de instalación de herramientas, excluyendo paquetes, incluidos los archivos de datos

Aquí es la estructura de mi proyecto:

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

Y aquí es 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 que tengo:

include LICENSE 
include RELEASE 
include README.md 

Construyo el alquitrán con:

python setup.py sdist 

Quiero:

  1. Excluir tests directorio de la distribución de código fuente;
  2. Tienen archivos LICENSE, README.md, RELEASE en el directorio de paquetes de sitio, ya sea en el nivel superior o dentro del directorio package1 (en este punto estoy de acuerdo con cualquiera de los dos).

En cambio, esto es lo que sucede:

  1. tests directorio sigue siendo estar en el archivo tar creado y se instala a los site-packages;
  2. Los archivos se copian en el archivo, pero no se instalan en el directorio empaquetado del sitio del paquete.

No tengo ideas, ¿alguien me puede explicar lo que estoy haciendo mal y cómo solucionarlo?

+1

qué Python no nos ama ... Es una tarea muy simple y común: _ignore varios archivos, e incluyen varios archivos poco comunes para package_. ¿Por qué es tan difícil de hacer? – maxkoryukov

Respuesta

15

Debe crear un nuevo archivo llamado MANIFEST.in en el nivel raíz de su paquete, a continuación, siga estas instrucciones:

  1. para controlar qué archivos terminan en el archivo de alquitrán, crear un nuevo archivo llamado MANIFEST.in en el nivel raíz de su paquete. Por ejemplo, puede excluir directorios enteros de su distribución, usando recursive-exclude en el archivo MANIFEST.in.En su caso, necesita su archivo MANIFEST.in contener:

    recursive-exclude tests * 
    
  2. No es común incluir README y otros archivos en el directorio site-packages, pero si realmente desea, y luego ir dentro package1 y crear simbólica enlaces a los archivos que desea incluir:

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

    continuación, cambie la siguiente línea en el setup.py:

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

    a:

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

si su estructura es cierto:

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

modo: Prueba una excluyen las pruebas/* en su MANIFEST.in

espero que había ayudado

+2

Tengo __init__.py en pruebas, en realidad, simplemente no lo mostré en la fuente. De hecho, si imprimo find_packages() result, solo devuelve package1. Pero la carpeta de pruebas todavía está incluida. – 0x4B1D

16

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

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

Suponiendo que todas las pruebas en su proyecto de vivir en los nombres de paquetes que terminan en tests o sub-paquetes de los paquetes, lo siguiente debería ser suficiente para excluir toda la prueba código:

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

Esta es la mejor respuesta a la pregunta – Greg

0

MANIFEST.in se ocuparía de ello.

prune tests/ 
include LICENSE README.md RELEASE 

si tiene archivos estáticos que se añade, añadirlos con

... 
recursive-include package1/static * 
Cuestiones relacionadas