Wie kann ich eine require.txt für mehrere Umgebungen anpassen?


111

Ich habe zwei Niederlassungen, Entwicklung und Produktion. Jedes hat Abhängigkeiten, von denen einige unterschiedlich sind. Die Entwicklung weist auf Abhängigkeiten hin, die sich selbst in der Entwicklung befinden. Ebenso für die Produktion. Ich muss auf Heroku bereitstellen, das die Abhängigkeiten der einzelnen Zweige in einer einzelnen Datei mit dem Namen "require.txt" erwartet.

Was ist der beste Weg, um zu organisieren?

Was ich gedacht habe:

  • Pflegen Sie separate Anforderungsdateien, eine in jedem Zweig (muss häufige Zusammenführungen überstehen!)
  • Sagen Sie Heroku, welche Anforderungsdatei ich verwenden möchte (Umgebungsvariable?)
  • Schreiben Sie Bereitstellungsskripte (temporären Zweig erstellen, Anforderungsdatei ändern, festschreiben, bereitstellen, temporären Zweig löschen)

1
Einfacheres Bereitstellungsskript: 2 Dateien verwalten. Verwenden Sie Symlink zwischen ihnen.
Udy

Antworten:


204

Sie können Ihre Anforderungsdateien kaskadieren und das Flag "-r" verwenden, um pip anzuweisen, den Inhalt einer Datei in eine andere aufzunehmen. Sie können Ihre Anforderungen wie folgt in eine modulare Ordnerhierarchie aufteilen:

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

Der Inhalt der Dateien würde folgendermaßen aussehen:

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
...

Außerhalb von Heroku können Sie jetzt folgende Umgebungen einrichten:

pip install -r requirements/dev.txt

oder

pip install -r requirements/prod.txt

Da Heroku im Projektstamm speziell nach "require.txt" sucht, sollte es nur das Produkt wie folgt spiegeln:

Anforderungen.txt:

# Mirrors prod
-r requirements/prod.txt

2
Sie haben das Problem ignoriert, wie separate Anforderungsdateien für verschiedene Umgebungen auf Heroku verwendet werden.
Ed J

29
Ich glaube, meine Antwort hat das angesprochen.
Christian Abbott

1
Ich suchte nach einer Möglichkeit, unterschiedliche Anforderungen an Heroku für das Staging (wo ich zusätzliche Debug-Pakete möchte) und die Produktionsumgebung (wo ich diese Debug-Pakete nicht benötige) zu haben. Leider, wie @EdJ sagte, spricht diese Antwort dies nicht an.
Antoine Pinsard

1
Ich könnte Ihre Frage falsch verstehen oder vielleicht ist Ihre Frage anders als das Originalplakat. Zur Verdeutlichung kann die Anforderung.txt des Staging-Zweigs "-r Anforderungen / staging.txt" (oder ähnliches) enthalten, während die Anforderung des Zweig-Zweigs "-r Anforderungen / prod.txt" enthalten kann (siehe Ende meiner Antwort). Synchronisieren Sie den entsprechenden Zweig mit der entsprechenden Heroku-Instanz.
Christian Abbott

2
@ SohamNavadiya Das habe ich nicht gefragt. Nehmen wir an, ich habe ein Paket base.txtmit 3 Paketen und dev.txt1 Paket (und -r base.txt). ALLE 4 Pakete sind in meiner virtuellen Umgebung installiert. Ich möchte jetzt das 5. Paket installieren und es in der Basis auflisten, NICHT in dev. Wie mache ich das? Klar, ich kann es installieren und pip freeze > base.txtdas löst das Problem NICHT. Es setzt dann die 4. Dev-Abhängigkeit in die Basis, die ich nicht will.
Manan Mehta

10

Eine praktikable Option, die es heute nicht gab, als die ursprüngliche Frage und Antwort veröffentlicht wurde, ist die Verwendung von pipenv anstelle von pip zum Verwalten von Abhängigkeiten.

Mit pipenv ist die manuelle Verwaltung von zwei separaten Anforderungsdateien wie bei pip nicht mehr erforderlich. Stattdessen verwaltet pipenv die Entwicklungs- und Produktionspakete selbst über Interaktionen in der Befehlszeile.

So installieren Sie ein Paket für die Produktion und Entwicklung:

pipenv install <package>

So installieren Sie ein Paket nur für die Entwicklungsumgebung:

pipenv install <package> --dev

Über diese Befehle speichert und verwaltet pipenv die Umgebungskonfiguration in zwei Dateien (Pipfile und Pipfile.lock). Herokus aktuelles Python-Buildpack unterstützt nativ pipenv und konfiguriert sich selbst über Pipfile.lock, falls es anstelle von require.txt vorhanden ist.

Eine vollständige Dokumentation des Tools finden Sie unter dem Pipenv-Link.


4
pipenv ist Zeitverschwendung. Das Sperren dauert zu lange.
Nurettin

8
pipenv ist in fast allen Aspekten kaputt. Es verspricht viel, aber es gibt nur sehr wenige
ospider

4
@ospider Verwenden Sie pipenv täglich und ich habe keine so negativen Probleme, wie Sie und nurettin berichten. Arbeiten mit pipenv Version 2018.10.13. In allen Aspekten gebrochen ist somit eine sehr leere Aussage.
Kwuite

1
@ Kwuite Ich teile das Gefühl deines letzten Satzes. Es gibt wenig Dialog, wenn ein Kommentar kritisch und dennoch leer ist.
Christian Abbott

3
Stimmen Sie mit Nurettin und Fischadler überein. pipenv ist schrecklich.
Andrew Palmer

3

Wenn Sie zwischen Umgebungen auf demselben Computer wechseln möchten, müssen Sie möglicherweise für jede Umgebung, in die Sie wechseln möchten, unterschiedliche virtuelle Env-Ordner erstellen.

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. 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.