2009-07-15 11 views
20

Quando il confezionamento di un pacchetto di Python con un setup.py che utilizza le setuptools:Come posso fare in modo che setuptools ignori l'inventario di subversion?

from setuptools import setup 
... 

distribuzione sorgente creato da:

python setup.py sdist 

non solo comprende, come al solito, i file specificati nel MANIFESTO. in, ma anche, gratuitamente, include tutti i file elencati da Subversion come controllati dalla versione sotto la directory del pacchetto. Questo è molto fastidioso. Non solo rende difficile esercitare un controllo esplicito su quali file vengono distribuiti con il mio pacchetto, ma significa che quando costruisco il mio pacchetto seguendo un "svn export" invece di un "svn checkout", il contenuto del mio il pacchetto potrebbe essere abbastanza diverso, poiché senza il .svn metadata setuptools farà scelte diverse su cosa includere.

La mia domanda: come posso disattivare questo comportamento terribile, in modo che "setuptools" tratta il mio progetto allo stesso modo, sia che io stia usando Subversion, o il controllo della versione di cui non si è mai sentito parlare, o un albero nudo creato con "svn esportare "che ho creato alla fine del mio progetto per assicurarmi che si costruisca in modo pulito da qualche parte oltre alla mia directory di lavoro?

Il meglio che sono riuscito finora è una brutta scimmia-patch:

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

Ma questo è Python, non è la giungla, così naturalmente voglio una soluzione migliore che non coinvolge le scimmie a tutti. Come posso domare gli strumenti di setup, disattivare la sua magia e comportarsi in modo sensato guardando invece le regole visibili e prevedibili nel mio MANIFEST.py?

+0

Penso di avere lo stesso identico problema qui, solo con .git e py2app: http://stackoverflow.com/questions/9845590/py2app-picking-up-git-subdir-of-a-package-during -build – jdi

+0

Wow, * sembra * lo stesso problema! –

+0

Ho postato un hack monkeypatch come risposta alla mia stessa domanda. Havent ha trovato qualcosa di meglio ancora – jdi

risposta

15

So che lei sa molto di questo, Brandon, ma cercherò di dare una risposta completa che posso (anche se io non sono un setuptools Gury) a beneficio degli altri.

Il problema qui è che il setuptools stesso implica un sacco di magia nera, incluso l'uso di un punto di ingresso chiamato setuptools.file_finders dove è possibile aggiungere plug-in per trovare i file da includere. Sono, tuttavia, ad una perdita completa di come TOGLIERE plugin da esso ...

  • soluzione rapida: svn esportare il pacchetto in una directory temporanea ed eseguire il setup.py da lì. Ciò significa che non hai svn, quindi il cercatore svn non trova file da includere. :)

  • Soluzione più lunga: hai davvero bisogno di setuptools? Setuptools ha molte funzionalità, quindi la risposta è probabile sì, ma principalmente quelle funzioni sono le dipendenze (quindi le dipendenze vengono installate da easy_install), i pacchetti namespace (foo.bar) e i punti di ingresso. I pacchetti Namespace possono essere creati anche senza setuptools. Ma se non usi nessuno di questi, potresti addirittura farla franca usando solo le distutils.

  • Brutta soluzione: la sequenza di tasti che hai assegnato a sdist nella tua domanda, che semplicemente rende il plugin privo di cercatori e esce rapidamente.

Quindi, come vedete, questa risposta, anche se completa come posso farcela, è ancora imbarazzantemente incompleta. Non posso rispondere alla tua domanda, anche se penso che la risposta sia "Non puoi".

1

Probabilmente la risposta è nel tuo setup.py. Usi i pacchetti find? Questa funzione utilizza per impostazione predefinita VCS (ad esempio, subversion, hg, ...). Se non ti piace, scrivi semplicemente una funzione Python diversa che raccoglie solo le cose che vuoi.

+0

find_packages di per sé utilizza solo listdir, infatti, e cerca i file chiamati '__init __. Py'. –

-1

probabilmente si desidera qualcosa di simile:

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... 
) 
+1

+1: per coloro che sono a valle, si prega di fornire una spiegazione del motivo per cui il post non è valido. Questo approccio sembra funzionare alla grande. –

0

Direi che il comportamento predefinito di sdist è corretto. Quando si crea una distribuzione di origine , mi aspetto che contenga lo tutto quello che è controllato in Subversion. Naturalmente sarebbe bello poterlo ignorare in modo pulito in circostanze particolari.

Confronta sdist to bdist_egg; Scommetto che solo i file specificati vengono inclusi esplicitamente.

Ho fatto un semplice test con tre file, tutti in svn. Vuoto dummy.lkj e foobar.py e con setup.py simile a questo:

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

sdist crea un tarball che include dummy.lkj. bdist_egg crea un uovo che non include dummy.lkj.

9

Creare un file MANIFEST.in con:

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

Vedere http://docs.python.org/distutils/commandref.html#sdist-cmd per la sintassi MANIFEST.in.

+0

Ciò produce un errore per me. Ho dovuto usare 'ricorsive-exclude. * '. –