Come faccio a gestire progetti all'interno di progetti in python?

1

Nota

Mi rendo conto che questa potrebbe essere una domanda soggettiva a cui rispondere, ma non mi aspetto una risposta sotto forma di "Fai questo e tutto funzionerà". Sono consapevole che ci saranno probabilmente alcune decisioni da prendere e che approcci diversi sono migliori per diversi scenari. In ogni caso, vorrei una recensione dei pro e dei contro di qualunque strategia i professionisti stiano effettivamente utilizzando.

Supponiamo che io stia scrivendo una grande biblioteca, chiamata BigLibrary. Questa libreria può essere suddivisa in diversi progetti più piccoli, alcuni dei quali sono anche utili al di fuori di BigLibrary. Qual è il modo migliore per organizzare la struttura delle cartelle e l'installazione per avere un flusso di lavoro regolare?

Considera che uso anche git e che molti sviluppatori dovrebbero essere in grado di lavorare su tutti gli aspetti del progetto.

Ho alcune opzioni:

Opzione 1

BigProject 
  __init__.py
  main_files.py
  subLibrary1
  subLibrary2

Il problema con questo è che subLibrary1 e subLibrary2 devono essere accessibili tramite BigProject, che non è l'ideale. Inoltre, complica il flusso di lavoro con git se voglio che subLibrary1 e subLibrary2 abbiano il proprio repository git.

Opzione 2

BigProject
  __init__.py
Library1
Library2

Il problema è che BigProject non vedrà Library1 e Library2, a meno che non li aggiunga manualmente a sys.path. Questa sembra una brutta soluzione. Rende tutto perfettamente funzionante con git, ma inquina anche lo spazio dei nomi un po '.

Idealmente, dovrei anche essere in grado di modificare Library1 e Library2 senza che ciò influisca su BigProject - e solo decidendo di aggiornare ad una certa versione di Library1 e Library2 quando ritengo che sia un buon momento. Fondamentalmente voglio fare in modo che BigProject usi un certo checkout di Library1 e 2 fino a quando decido di "aggiornarlo" e portarlo all'attuale checkout.

    
posta Ant 08.02.2018 - 12:07
fonte

1 risposta

3

Nessuno dei due. Rendi possibile installare le librerie tramite pip , quindi aggiungere una versione specifica a git submodule . In dettaglio:

Non separare le librerie secondarie attraverso un particolare layout di directory. E non scherzare con sys.path . Invece, rendi le tue librerie installabili separatamente. Questo probabilmente significa un repository git separato, completo del proprio setup.py . Ciò è fonte di confusione la prima volta che lo fai, ma in seguito il setup.py rimane per lo più uguale. Alcune opzioni di configurazione sono rilevanti solo quando si distribuisce la libreria tramite PyPI, non è il caso per te.

Ora puoi verificare la libreria e installarla come pip install path/to/library . Ma come specificare quale versione della dipendenza deve essere installata?

La soluzione consiste nel bloccare una versione specifica attraverso un git submodule . Ciò include il repository della libreria come una cartella nel repository principale, in una versione specifica. Puoi mettere tutte le tue librerie in una cartella comune, ad es. lib/library1 e lib/library2 . I sottomoduli Git richiedono un po 'di tempo per abituarsi, perché è necessario creare un commit nel repository principale quando si desidera utilizzare una nuova versione del repository del sottomodulo: il sottomodulo viene visualizzato come un singolo file che contiene l'hash del commit corrente del sottomodulo.

Puoi quindi installare le librerie come moduli modificabili, ad es. %codice%. La modalità pip install -e lib/library1 significa che le modifiche al codice sorgente delle librerie sono direttamente disponibili quando si importa quella libreria. Altre modifiche potrebbero richiedere la reinstallazione della libreria (ricordarsi di aggiungere il flag --editable durante la reinstallazione).

È ragionevole creare una virtualizzazione per il tuo progetto principale. Questo non è impegnato nel repository, ma evita di inquinare l'installazione globale di Python.

Uno svantaggio di gestire le dipendenze localmente è che non è possibile utilizzare la risoluzione delle dipendenze integrata di pip. Se lo scenario diventa più complicato, potrebbe essere utile disporre di un mirror PyPI interno a cui vengono caricate le dipendenze. È quindi possibile istruire pip per soddisfare le dipendenze da lì. Ma questo è probabilmente eccessivo quando si inizia.

Layout di directory consigliato:

bigProject/
  lib/
    library1/
      library1/
        __init__.py
      setup.py
    library2/
      library2/
        __init__.py
      setup.py
  bigProject/
    __init__.py
  requirements.txt

Il file requirements.txt può inviare istruzioni a pip e conterrà i percorsi dei sottomoduli.

All'interno del codice, puoi quindi utilizzare le librerie installate come le normali librerie:

import library1
    
risposta data 08.02.2018 - 14:07
fonte

Leggi altre domande sui tag