Come personalizzare un requirements.txt per più ambienti?


112

Ho due filiali, sviluppo e produzione. Ognuno ha dipendenze, alcune delle quali sono diverse. Lo sviluppo indica le dipendenze che sono esse stesse in fase di sviluppo. Allo stesso modo per la produzione. Ho bisogno di distribuire a Heroku che prevede le dipendenze di ogni ramo in un singolo file chiamato "requirements.txt".

Qual è il modo migliore per organizzarsi?

A cosa ho pensato:

  • Mantieni file di requisiti separati, uno in ogni ramo (deve sopravvivere a frequenti fusioni!)
  • Di 'a Heroku quale file di requisiti voglio usare (variabile d'ambiente?)
  • Scrivere script di distribuzione (creare un ramo temporaneo, modificare il file dei requisiti, eseguire il commit, distribuire, eliminare il ramo temporaneo)

1
script di distribuzione più semplice: mantieni 2 file. usa il collegamento simbolico tra di loro.
Udy

Risposte:


208

Puoi mettere in cascata i tuoi file dei requisiti e usare il flag "-r" per dire a pip di includere il contenuto di un file dentro un altro. Puoi suddividere i tuoi requisiti in una gerarchia di cartelle modulare come questa:

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

Il contenuto dei file sarebbe simile a questo:

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

Al di fuori di Heroku, ora puoi configurare ambienti come questo:

pip install -r requirements/dev.txt

o

pip install -r requirements/prod.txt

Poiché Heroku cerca specificamente "requirements.txt" nella radice del progetto, dovrebbe semplicemente rispecchiare prod, in questo modo:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt

2
Hai ignorato il problema di come utilizzare file di requisiti separati per ambienti diversi su heroku.
Ed J

29
Credo che la mia risposta abbia affrontato questo.
Christian Abbott

1
Stavo cercando un modo per avere requisiti diversi su Heroku per lo staging (dove voglio pacchetti di debug aggiuntivi) e l'ambiente di produzione (dove non ho bisogno di questi pacchetti di debug). Sfortunatamente, come ha detto @EdJ, questa risposta non affronta questo problema.
Antoine Pinsard

1
Potrei fraintendere la tua domanda o forse la tua domanda è diversa dal poster originale. Ma per chiarimenti, il file requirements.txt del ramo di staging può contenere "-r requirements / staging.txt" (o simile), mentre quello del ramo prod può contenere "-r requirements / prod.txt" (vedere la fine della mia risposta). Sincronizza il ramo appropriato con la sua istanza Heroku corrispondente.
Christian Abbott

2
@SohamNavadiya Non è quello che ho chiesto. Diciamo che ho un base.txtcon 3 pacchetti in esso e dev.txtcon 1 pacchetto in esso (e -r base.txt). TUTTI e 4 i pacchetti sono installati nel mio ambiente virtuale. Voglio ora installare il quinto pacchetto ed elencarlo nella base, NON in dev, come posso farlo? Certo, posso installarlo e pip freeze > base.txtma questo NON risolve il problema. Quindi mette la quarta dipendenza dev in base che non voglio.
Manan Mehta

11

Un'opzione praticabile oggi che non esisteva quando la domanda e la risposta originali sono state pubblicate è usare pipenv invece di pip per gestire le dipendenze.

Con pipenv, la gestione manuale di due file di requisiti separati come con pip non è più necessaria e pipenv gestisce invece i pacchetti di sviluppo e produzione tramite interazioni sulla riga di comando.

Per installare un pacchetto da utilizzare sia in produzione che in sviluppo:

pipenv install <package>

Per installare un pacchetto solo per l'ambiente di sviluppo:

pipenv install <package> --dev

Tramite questi comandi, pipenv memorizza e gestisce la configurazione dell'ambiente in due file (Pipfile e Pipfile.lock). L'attuale buildpack Python di Heroku supporta nativamente pipenv e si configurerà da Pipfile.lock se esiste al posto di requirements.txt.

Vedere il collegamento pipenv per la documentazione completa dello strumento.


4
pipenv è una perdita di tempo. Il blocco richiede troppo tempo.
nurettin

9
pipenv è rotto in quasi tutti gli aspetti. Promette molto, ma spedisce pochissime
ospider

5
@ospider Usi pipenv su base giornaliera e non sto riscontrando problemi così negativi come stai segnalando tu e nurettin. Lavorare con pipenv versione 2018.10.13. Spezzata in tutti gli aspetti è quindi un'affermazione molto vuota.
Kwuite

1
@Kwuite Condivido il sentimento della tua ultima frase. C'è poco dialogo in cui impegnarsi quando un commento è critico ma vacuo.
Christian Abbott

3
D'accordo con Nurettin e Ospider. pipenv è orribile.
Andrew Palmer

3

Se la tua esigenza è quella di poter passare da un ambiente all'altro sulla stessa macchina, potrebbe essere necessario creare cartelle virtualenv diverse per ogni ambiente a cui devi passare.

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.