Come condividere i tuoi pacchetti Python

Panoramica

I pacchetti Python sono gli elementi costitutivi delle applicazioni Python. Incapsulano alcune funzionalità coerenti che possono essere importate e utilizzate da molte applicazioni e sistemi. Ma prima, gli sviluppatori devono trovare il tuo pacchetto ed essere in grado di installarlo. Python fornisce un repository pubblico gratuito per i pacchetti, che è lo standard di fatto per la condivisione dei pacchetti Python. Puoi anche utilizzare repository di pacchetti privati ​​per pacchetti proprietari.

In questo tutorial imparerai come condividere i tuoi pacchetti con la community. Se possiedi pacchetti proprietari da condividere solo all'interno della tua azienda, imparerai a farlo anche tu.

Per informazioni sullo sfondo, vedi Come usare i pacchetti Python e come scrivere i tuoi pacchetti Python. 

Cos'è PyPI?

PyPI è l'acronimo di Python Package Index. È un repository pubblico per il caricamento dei pacchetti. Pip è a conoscenza di PyPI e può installare e / o aggiornare i pacchetti da PyPI. Il PyPI veniva chiamato il "Cheese Shop" dopo il famoso schizzo di Monty Python. Se senti che le persone si riferiscono al "Cheese Shop" in un contesto di packaging Python, non allarmarti. È solo PyPI.

Preparare un pacchetto per il caricamento

Prima di caricare un pacchetto, è necessario disporre di un pacchetto. Userò il pacchetto conman che ho introdotto nell'articolo Come scrivere i propri pacchetti Python. Dato che PyPI contiene migliaia di pacchetti, è molto importante essere in grado di descrivere correttamente il pacchetto se si desidera che le persone lo trovino. PyPI supporta un impressionante set di tag di metadati per consentire alle persone di trovare il pacchetto giusto per il lavoro.

Il file setup.py contiene molte informazioni importanti utilizzate per installare il pacchetto. Ma può anche includere i metadati usati per classificare il tuo pacchetto su PyPI. I pacchetti sono classificati utilizzando più tag di metadati. Alcuni di loro sono testuali e alcuni di loro hanno una lista di valori possibili. L'elenco completo è disponibile sulla pagina degli elenchi di classificatori di PyPI.

Aggiungiamo alcuni classificatori a setup.py. Non è necessario incrementare il numero di versione poiché sono solo metadati e il codice rimane lo stesso:

da setuptools import setup, find_packages setup (name = 'conman', version = "0.3", url = "https://github.com/the-gigi/conman", license = "MIT", author = "Gigi Sayfan" , author_email = "[email protected]", description = "Gestisci i file di configurazione", classificatori = ['Stato di sviluppo :: 3 - Alfa', 'Destinatari previsti :: Sviluppatori', 'Argomento :: Sviluppo software :: Libraries ',' License :: OSI Approved :: MIT License ',' Programming Language :: Python :: 2 ',' Programming Language :: Python :: 2.6 ',' Programming Language :: Python :: 2.7 ',], packages = find_packages (exclude = ['tests']), long_description = open ('README.md'). read (), zip_safe = False, setup_requires = ['nose> = 1.0'], test_suite = "nose.collector" )

Crea un account

È necessario creare un account su PyPI per poter caricare i pacchetti. Compila questo modulo e verifica la tua identità facendo clic sull'URL nell'email di verifica. Ora, è necessario creare un .pypyrc file nella tua home directory che conterrà le informazioni necessarie per caricare i pacchetti.

[distutils] index-servers = pypi [pypi] repository = https://pypi.python.org/pypi username = the_gigi 

Puoi anche aggiungere la tua password, ma è più sicuro se non lo fai nel caso in cui qualche elemento negativo si impadronisca del tuo laptop. Questo è particolarmente importante se carichi pacchetti popolari perché se qualcuno può caricare o aggiornare i tuoi pacchetti, tutte le persone che usano questi pacchetti saranno vulnerabili.

analisi

Se si desidera verificare la registrazione del pacchetto e il processo di caricamento e non preoccuparsi di pubblicare qualcosa di incompleto, è possibile lavorare con il sito di test PyPI alternativo. Estendi il tuo file ~ / .pypirc per includere una sezione 'pypitest'.

[distutils] index-servers = pypi pypitest [pypitest] repository = https://testpypi.python.org/pypi username = the_gigi [pypi] repository = https://pypi.python.org/pypi username = the_gigi 

Ricorda che il sito di test viene pulito regolarmente, quindi non fare affidamento su di esso. È inteso solo a scopo di test.

Registra il tuo pacchetto

Se questa è la prima versione del pacchetto, è necessario registrarlo con PyPI. Twine ha un comando register, ma non riesco a capire come usarlo. Seguendo la documentazione si produce un errore e controllando i test unitari per lo spago non vi è alcun test per il comando di registro. Oh bene. Puoi farlo manualmente anche usando questo modulo per caricare il file PKG-INFO. Se usi Python 2.7.9+ o Python 3.2+, puoi anche registrarti tranquillamente usando python registro setup.py.

Registriamo conman sul sito di prova PyPI. Notare la -r pypitest, che si basa sulla sezione in ~ / .Pypirc si registrerà al sito di test.

python setup.py register -r registro di corsa pypitest in esecuzione egg_info scrittura di conman.egg-info / PKG-INFO scrittura di nomi di livello superiore in conman.egg -info / top_level.txt scrittura di dipendency_links nella lettura di conman.egg-info / dependency_links.txt manifest file 'conman.egg-info / SOURCES.txt' lettura manifest template 'MANIFEST.in' scrittura file manifest 'conman.egg-info / SOURCES.txt' controllo in esecuzione Password: registrazione conman a https: //testpypi.python. risposta del server org / pypi (200): OK

Spago

Puoi caricare un pacchetto usando caricamento python setup.py, ma non è sicuro dato che ha usato il tuo nome utente e password su HTTP fino a Python 2.7.9 e Python 3.2. Twine utilizza sempre HTTPS e offre ulteriori vantaggi, come il caricamento di distribuzioni pre-create e supporta qualsiasi formato di imballaggio, incluse le ruote. Userò cordicella per il caricamento effettivo.

Twine non fa parte della libreria standard quindi è necessario installarlo: pip installare cordicella.

Carica il tuo pacchetto

Infine, è il momento di caricare effettivamente il pacchetto. 

> caricamento twine -r pypitest -p ******* dist / * Caricamento delle distribuzioni su https://testpypi.python.org/pypi Caricamento di conman-0.3-py2-none-any.whl Caricamento di conman-0.3-py2 .py3-none-any.whl Caricamento di conman-0.3.tar.gz

Twine ha caricato tutti i formati di distribuzione, sia la fonte che le ruote. 

Prova il tuo pacchetto

Una volta che il pacchetto è su PyPI, è necessario assicurarsi di poterlo installare e tutto funziona. Qui creo un ambiente virtuale monouso, pip installiamo conman dal sito di test PyPI e quindi lo importiamo. Potresti voler eseguire test più approfonditi per il tuo pacchetto.

> mkvirtualenv test_conman_pypi Nuovo eseguibile python in test_conman_pypi / bin / python2.7 Creazione anche eseguibile in test_conman_pypi / bin / python Installazione di setuptools, pip ... terminato. Utilizzo: source deactivate rimuove la directory 'bin' dell'ambiente attivato con 'source activate' da PATH. (test_conman_pypi)> pip install -i https://testpypi.python.org/pypi conman Scaricare / decomprimere conman Scaricare conman-0.3-py2-none-any.whl Memorizzare il download nella cache in /Users/gigi/.cache/pip /https%3A%2F%2Ftestpypi.python.org%2Fpackages%2Fpy2%2Fc%2Fconman%2Fconman-0.3-py2-none-any.whl Installazione dei pacchetti raccolti: conman Installato con successo Pulizia con ... (test_conman_pypi)> python Python 2.7 .10 (predefinito, 10 giugno 2015, 19:43:32) [GCC 4.2.1 Compatibile Apple LLVM 6.0 (clang-600.0.57)] su darwin Digitare "help", "copyright", "credits" o "license" per maggiori informazioni. >>> import conman >>>

Si noti che la distribuzione delle ruote è stata installata di default.

versioning

Quando sviluppi i tuoi pacchetti e carichi nuove versioni, è importante seguire un ragionevole sistema di controllo delle versioni. Le persone si arrabbieranno se un aggiornamento involontario interrompe il loro codice. Lo schema di controllo delle versioni deve essere conforme a PEP-440 - Identificazione della versione e specifiche di dipendenza. 

Questa specifica consente a più schemi di scegliere. Raccomando di utilizzare il popolare schema di Versioning semantico. È più o meno "..", che corrisponde al PEP-440".."Attenti solo alle versioni che continuano il trattino o segni più, che non sono compatibili con PEP-440.

Repository di pacchetti privati

PyPI è fantastico, ma a volte non vuoi condividere i tuoi pacchetti. Molte aziende e organizzazioni hanno team di ingegneri che usano Python e hanno bisogno di condividere pacchetti tra di loro, ma non sono autorizzati a condividerli pubblicamente su PyPI. Questo non è un problema. Puoi condividere i pacchetti su repository di pacchetti privati ​​sotto il tuo controllo. 

Nota che a volte potresti voler avere un repository di pacchetti privato sotto il tuo controllo solo per gestire le dipendenze di terze parti. Ad esempio, un autore di un pacchetto può decidere di eliminare un pacchetto da PyPI. Se il tuo sistema si basa sulla possibilità di installare questo pacchetto da PyPI, sei nei guai.

Devpi

Devpi (che sta per indice del pacchetto di sviluppo) è una sostituzione drop-in per il server pubblico PyPI. È concesso in licenza open source e MIT, quindi puoi eseguirlo all'interno del tuo firewall. Devpi è molto potente e ha molte caratteristiche che gli permettono di funzionare come il tuo ultimo server di packaging:

  • Specchio veloce PyPI
  • Caricamento, test e gestione temporanea con indici privati
  • Ereditarietà dell'indice
  • Interfaccia Web e ricerca
  • replicazione
  • Importazione / Esportazione
  • Integrazione con Jenkins

Devpi ha un'eccellente documentazione, un sistema di plugin ed è in sviluppo attivo con una comunità vivace.

Conclusione

Python fornisce una soluzione completa per ospitare i tuoi pacchetti e renderli disponibili ai tuoi colleghi Pythonistas. C'è un processo semplificato assistito da strumenti per confezionare e caricare pacchetti e renderli facili da trovare e installare. 

Se è necessario mantenere le cose private, Devpi è qui per te come un repository di pacchetti privati ​​maturo e robusto.