Migliore dipendenza da Python durante la creazione del pacchetto del progetto

Sto preparando questa idea per l’argomento del blog da molto tempo. Ho cercato, letto e provato molto mentre lavoravo su diversi progetti. Ma anche oggi, dopo averlo pubblicato, non credo di essere soddisfatto al 100% della soluzione fornita su come gestire in modo efficiente le dipendenze del progetto Python.

Che cos’è la gestione dei pacchetti e delle dipendenze?

Il software rilasciato in pacchetti in bundle in questo modo è più facile gestire i programmi installati.

Il gestore di pacchetti è una raccolta di librerie che vengono impacchettate insieme, il che rende più facile scaricare l’intero pacchetto piuttosto che ciascuna libreria.

Quasi tutte le librerie nel pacchetto hanno una dipendenza gestita dal d ependency manager.

La gestione delle dipendenze aiuta a gestire tutte le librerie necessarie per far funzionare un’applicazione. È incredibilmente vantaggioso quando hai a che fare con progetti complessi e in un multiambiente. La gestione delle dipendenze aiuta anche a tenere traccia, aggiornare le librerie più velocemente e più facilmente, oltre a risolvere il problema, quindi un pacchetto dipenderà da un altro pacchetto.

Ogni linguaggio di programmazione ha il suo sapore di gestore delle dipendenze.

Per riassumere tutto quanto sopra:

Modo tipico di gestire la dipendenza dal progetto oggi

Oggi il gestore di pacchetti Python più utilizzato è pip , utilizzato per installare e gestire pacchetti software python, che si trova nell’indice dei pacchetti Python. Pip aiuta noi, sviluppatori Python, a controllare facilmente “manualmente” l’installazione e il ciclo di vita dei pacchetti Python disponibili pubblicamente dai loro repository online.

Pip può anche aggiornare, mostrare, disinstallare le dipendenze del progetto, ecc.

Per installare il pacchetto, puoi semplicemente eseguire pip install & lt; somepackage & gt; che creerà una libreria Python aggiuntiva nella tua home directory.

L’esecuzione di pip freeze può aiutare a controllare i pacchetti installati e le versioni dei pacchetti elencate in ordine ordinato senza distinzione tra maiuscole e minuscole.

Configurazione del progetto

Dopo aver creato la tua applicazione, dovrai eseguire una serie di azioni (passaggi) per rendere disponibili le dipendenze dell’applicazione nei diversi ambienti.

Le azioni saranno simili a quella seguente:

Installa le dipendenze del progetto

Quando se hai intenzione di condividere il progetto con il resto del mondo, dovrai installare le dipendenze eseguendo $ pip install -r requirements.txt

Per trovare maggiori informazioni sui singoli pacchetti nel file requiements.txt puoi usare $ pip show & lt; packagename & gt ;. Ma quanto è informativo l’output?

Come si possono mantenere facilmente le dipendenze del progetto?

Personalmente, penso che la configurazione precedente non sia facile da mantenere, per una serie di motivi:

Esistono alternative migliori?

Opzione 1: più file requirements.txt?

Ci sono molti esempi di progetti con più file requirements.txt. Sviluppatori che hanno diverse versioni del file requirements.txt, ad esempio, per diversi ambienti (ad esempio, test o locale) o file per diversi utenti (ad esempio, macchine e persone).

Multiple requirements.txt è una buona soluzione per la gestione delle dipendenze del progetto? Non sono d’accordo … gestire manualmente vari file requirements.txt non è una buona soluzione, e non sarà facile se crescono anche più di ~ 50 righe.

Opzione 2: Pipreqs e Pipdeptre possono renderlo migliore?

Di recente ho provato l’utilità pipreqs , che genera il file requirements.txt in base alle importazioni del progetto. È semplice da usare.

Per generare un file requirements.txt puoi eseguire pipreqs / your_project / path

Pipdeptree

Ho pensato di combinarlo con pipdeptree un’altra fantastica e “pratica” utility a riga di comando che aiuterà a visualizzare i pacchetti python installati sotto forma di un albero delle dipendenze.

Dopo aver eseguito il comando pipdeptree nella finestra del terminale nella directory virtualenv del progetto, verranno visualizzati tutti i pacchetti python installati di un albero delle dipendenze:

Fantastico bonus che pipdeptree ti avvisa quando hai più dipendenze in cui le versioni non corrispondono esattamente.

Ho trovato utile in alcuni casi, come:

Ci sono anche alcuni aspetti negativi, Pipreq non includerà i plugin richiesti per progetti specifici e finirai per aggiungere manualmente le informazioni sui plugin in un requisito.txt. Non è ancora un’utilità molto matura.

Opzione 3: hai provato pip-compile?

Il modulo pip-compile fornisce due comandi: pip-compile e pip-sync .

Il comando

<”pip-compile genererà requirements.in o requirements.txt del riepilogo di primo livello di i pacchetti e tutte le (dipendenze sottostanti) bloccate. E puoi memorizzare file .in e .txt nel controllo della versione. Quanto è utile, vero?

Ciò significa che possiamo ottenere le stesse versioni ogni volta che eseguiamo pip install , indipendentemente dalla nuova versione.

-generate-hashes flag aiuta a generare hash. In questo caso pip-compile consulta l'indice PyPI per ogni pacchetto di primo livello richiesto, cercando le versioni del pacchetto disponibili.

Per aggiornare tutti i pacchetti, riesegui periodicamente pip-compile --upgrade .

Per aggiornare un pacchetto specifico alla versione più recente oa una particolare versione, utilizzare il flag --upgrade-package o -P .

pip-sync comando utilizzato per aggiornare il tuo ambiente virtuale in modo che rifletta esattamente ciò che contiene. Il comando installerà / aggiornerà / disinstallerà tutto il necessario per abbinare i contenuti di requirements.txt .

Le dipendenze software sono spesso la superficie di attacco più ampia

Per sapere quali dipendenze ha il tuo progetto è molto utile scoprire a posteriori quali pacchetti sono stati installati e quali dipendenze ha il tuo progetto.

Le organizzazioni di solito assumono che la maggior parte dei rischi provenga da applicazioni web rivolte al pubblico. Quello è cambiato. Con dozzine di piccoli componenti in ogni applicazione, le minacce possono provenire da qualsiasi punto della base di codice.

Attualmente l'utilizzo di pip freeze mostrerà solo l'elenco finale delle dipendenze del pacchetto.

Suggerirei di utilizzare il modulo pipdeptree che aiuta a trovare possibili conflitti di dipendenza e visualizzare una dipendenza effettiva nel progetto.

pipdeptree --reverse pacchetto leaf installato per primo

Un altro buon consiglio è iniziare a creare applicazioni utilizzando Docker . Ogni strumento che eseguiamo in Docker è uno strumento in meno che dobbiamo installare localmente, quindi la fase di installazione e esecuzione sarà molto più veloce. Ma questo è un argomento diverso.

Confezione felice.

Lettura interessante:

Wiki su pip https://www.kennethreitz.org/essays/announcing-pipenv

Aggiunta di pacchetti: http://nvie.com/posts/pin-your-packages/

Docker: https://www.fullstackpython.com/docker.html