2015-02-13 20 views
17

TL; DR: esiste un modo per agganciare lo 'sviluppo' di setuptool per installare una serie di requisiti di sviluppo durante l'esecuzione di python setup.py develop?Setuptools "development" Requisiti

Sto costruendo il mio primo pacchetto python usando setuptools. Sto specificando i requisiti:

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

test_requirements = [ 
    'pytest', 
    'pytest-pep8', 
    'pytest-cov', 
] 

setup(
... 
    install_requires=requirements, 
    tests_require=test_requirements, 
... 
) 

Durante lo sviluppo, sono stato l'installazione del pacchetto (in un ambiente virtuale) con:

python setup.py develop 

e disinstallazione con:

python setup.py develop -u 

Il pacchetto usa entry_points per installare alcuni script da riga di comando, quindi questo imposta i comandi per me e mi consente di modificare il pacchetto mentre collaudo il comando allo stesso tempo.

Ho anche alcune dipendenze che uso per lo sviluppo ... sfinge + estensioni e un altro paio di cose (cose che non sono necessarie per usare il pacchetto). Sto solo installandoli manualmente nell'ambiente virtuale al momento. Non ho visto alcuna documentazione (e non ho trovato esempi sui google) su come collegarli con setuptools.

Forse c'è un modo per collegare "setup.py develop" per installare un set aggiuntivo di requisiti? Un altro metodo di cui non ho letto?

+1

Per scopi di sviluppo, consigliamo di utilizzare un 'requirements.txt' per bloccare le versioni del pacchetto per un ambiente di sviluppo, quindi eseguire' pip install -r requirements.txt' per distribuire quell'ambiente. Questo è il tipo di caso d'uso per cui è lì. – Iguananaut

risposta

26

Per ulteriori informazioni sull'utilizzo di setup.py vs requirements.txt, ho trovato utile this article.

Aggiornamento: settembre 2016

non uso più requirements.txt (vedi risposta originale sotto) per l'installazione di sviluppo solo pacchetti. La saggezza prevalente sembra essere che requirements.txt debba essere utilizzato per appuntare le distribuzioni su numeri di versione specifici, in genere utilizzando pip freeze > requirements.txt. Ciò garantisce che le stesse identiche versioni delle dipendenze del progetto e anche le dipendenze delle dipendenze del progetto siano installate su tutti i tuoi server.

Io invece utilizzo l'opzione extras_require su setup.

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

setup({ 
    install_requires=requirements, 
    extras_require={ 
     'dev': [ 
      'pytest', 
      'pytest-pep8', 
      'pytest-cov' 
     ] 
    } 
}) 

Ora, per installare il pacchetto per lo sviluppo, si esegue pip install -e .[dev]. Questo installa tutti i pacchetti regolari richiesti e quelli elencati nella sezione dev di extras_require.

Le installazioni di produzione possono ancora essere eseguite con python setup.py install o pip install . (o con un file requirements.txt).

risposta originale

Ecco un modo per farlo che sembra essere in linea con le raccomandazioni che ho incontrato per quanto riguarda setup.py vs requirements.txt. Specificare tutte le dipendenze di produzione nel parametro install_requires di setup.py.

requirements = [ 
    'click', 
    'ansible', 
    'fabric', 
    'gitpython', 
    'pyyaml', 
    'jinja2', 
    'yapsy' 
] 

setup({ 
    # ... 
    install_requires=requirements 
    # ... 
}) 

quindi creare un file di requirements.txt che indica pip per installare le dipendenze di produzione da setup.py così come le dipendenze di test.

-e . 

pytest 
pytest-pep8 
pytest-cov 

Ora è possibile installare il pacchetto per lo sviluppo con pip install -r requirements.txt. La linea -e . installa il pacchetto e le sue dipendenze da setup.py in modalità sviluppo. Per l'installazione in produzione, è possibile utilizzare python setup.py install o pip install .. Questo installerà solo le dipendenze elencate in setup.py.

+3

Ciò probabilmente confonderebbe le distribuzioni simili a Heroku, poiché utilizzano 'requisiti.txt' per i requisiti di produzione. – Ale