2011-12-19 9 views
14

Jestem całkiem nowy w setuptools. Widziałem kilka podobnych pytań i to jest trochę szalone, że zdawałem się postępować zgodnie z poradami, które widziałem, ale narzędzia do ustawiania wciąż robią coś innego niż to, co chcę.kłopoty setuptools - z wyjątkiem pakietów, w tym plików danych

Oto struktura mojego projektu:

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

A oto treść mojego 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'] 
    }, 
) 

Również w moim pliku manifestu mam:

include LICENSE 
include RELEASE 
include README.md 

Buduję smołę za pomocą:

python setup.py sdist 

chcę:

  1. Wykluczanie tests katalog z dystrybucji źródłowej;
  2. Posiadaj pliki LICENSE, README.md, RELEASE w katalogu site-packages, na najwyższym poziomie lub wewnątrz katalogu package1 (w tym momencie zgadzam się).

Zamiast tego, oto co się dzieje:

  1. tests pozostaje do katalogu utworzonego w archiwum tar i zostanie zainstalowany do miejsca opakowań;
  2. Pliki są kopiowane do archiwum, ale nie są instalowane w katalogu pakietu znajdującym się w pakiecie.

Nie mam pomysłów, czy ktoś może mi wytłumaczyć, co robię źle i jak to naprawić?

+1

dlaczego pyton nas nie kocha ... Jest to bardzo proste i wspólne zadanie: _ignore kilka plików i obejmują kilka niepospolonych plików do package_. Dlaczego tak trudno to zrobić? – maxkoryukov

Odpowiedz

15

Należy utworzyć nowy plik o nazwie MANIFEST.in poziomu głównego pakietu, a następnie te instrukcje:

  1. kontrolować, które kończą się w pliku tar plików, utwórz nowy plik o nazwie MANIFEST.in poziomu głównego pakietu. Na przykład można wykluczyć całe katalogi z dystrybucji, używając recursive-exclude w pliku MANIFEST.in.W twoim przypadku trzeba plik MANIFEST.in zawierać:

    recursive-exclude tests * 
    
  2. To nie jest powszechne obejmują README i inne pliki w katalogu site-packages, ale jeśli naprawdę chcesz, to idź wewnątrz package1 i stworzyć symboliczny linki do plików, które mają zostać uwzględnione:

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

    Następnie zmień następującą linię w swoim setup.py:

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

    do:

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

jeśli struktura jest prawdziwe:

  1. folder testy nie jest pakiet (nie ma startowy plik .py), więc find_package nie wykluczają go.
  2. include_package_data = True oznacza, że ​​wszystkie pliki w wersji fabrycznej zostaną uwzględnione, jeśli nie zostaną jawnie wykluczone.

tak: spróbuj wykluczyć testów/* w MANIFEST.in

Mam nadzieję, że pomógł

+2

Mam __init__.py w testach, faktycznie, po prostu nie pokazałem go w źródle. W rzeczywistości, jeśli wydrukuję wynik find_packages(), zwróci on tylko pakiet1. Ale folder testów jest nadal dołączony. – 0x4B1D

16

find_packages wykorzystuje fnmatchcase do jego wyłączenia filtrowania. Można sprawdzić, czy wzór wykluczenie pasuje do nazwy pakietu w następujący sposób:

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

Zakładając wszystkie testy w projekcie żyć w nazwach pakietów kończąc tests lub podpakietów tych pakietów, następujące powinny wystarczyć, aby wykluczyć wszelkie test kod:

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

To jest najlepsza odpowiedź na to pytanie – Greg

0

MANIFEST. Zajmie się tym.

prune tests/ 
include LICENSE README.md RELEASE 

jeśli masz pliki statyczne należy dodać, dodać je

... 
recursive-include package1/static *