417 Stimmen

Ist es schlimm, mein virtualenv-Verzeichnis innerhalb meines Git-Repositorys zu haben?

Ich denke darüber nach, das virtualenv für eine Django-Web-App, die ich erstelle, innerhalb meines Git-Repositorys für die App zu platzieren. Es scheint eine einfache Möglichkeit zu sein, um Bereitstellungen einfach und unkompliziert zu halten. Gibt es einen Grund, warum ich das nicht tun sollte?

468voto

RyanBrady Punkte 6213

Ich verwende pip freeze, um die Pakete, die ich benötige, in eine requirements.txt Datei zu bekommen und füge diese meinem Repository hinzu. Ich habe versucht darüber nachzudenken, warum man das gesamte virtualenv speichern möchte, aber ich konnte keinen Grund dafür finden.

0 Stimmen

Großartiger Vorschlag! Ich verstehe, dass ich eine requirements.txt-Datei verwenden kann, um Pakete zu verfolgen. Allerdings möchte ich das virtualenv gerne im Repository behalten, um das Bereitstellen neuer Server einfacher zu machen. Wenn das virtualenv innerhalb der Anwendung enthalten ist, muss ich keine neues virtualenv in neuen Instanzen erstellen, die ich hochfahre, alles was ich tun muss, ist den Code zu ziehen. Ich weiß, ich könnte etwas wie Fabric verwenden, um die Umgebung für mich einzurichten, aber es scheint einfach ein unnötiger Schritt zu sein, wenn ich die Umgebung einfach in meinem Repository behalten kann.

113 Stimmen

Sie können den unnötigen Speicherplatz in Ihrem Repository einsparen und dennoch mit einem einzigen Befehl auf einen neuen Server bereitstellen: virtualenv --no-site-packages --distribute .env && source .env/bin/activate && pip install -r requirements.txt

0 Stimmen

Fantastisch, ich werde dieses Beispiel im Hinterkopf behalten. Aber es scheint, dass es neben den zusätzlichen Speicheranforderungen keinen Grund gibt, warum ich die Umgebung nicht einfach im Repository behalten kann.

93voto

David Sickmiller Punkte 1085

Das Speichern des virtualenv-Verzeichnisses innerhalb von Git ermöglicht es Ihnen, die gesamte App einfach durch ein Git-Clonen bereitzustellen (zusätzlich zur Installation und Konfiguration von Apache/mod_wsgi), wie Sie bemerkt haben. Ein potenziell signifikantes Problem bei diesem Ansatz ist, dass unter Linux der vollständige Pfad im Aktivierungs-, django-admin.py-, easy_install- und pip-Skript des venvs fest codiert wird. Dies bedeutet, dass Ihr virtualenv nicht vollständig funktionieren wird, wenn Sie einen anderen Pfad verwenden möchten, vielleicht um mehrere virtuelle Hosts auf demselben Server auszuführen. Ich denke, die Website könnte tatsächlich mit den falschen Pfaden in diesen Dateien funktionieren, aber Sie würden Probleme haben, wenn Sie das nächste Mal versuchen, Pip auszuführen.

Die bereits gegebene Lösung besteht darin, genügend Informationen in Git zu speichern, sodass Sie während des Deployments das virtualenv erstellen und die erforderlichen Pip-Installationen durchführen können. Normalerweise führen die Leute pip freeze aus, um die Liste zu erhalten, und speichern sie dann in einer Datei mit dem Namen requirements.txt. Sie kann mit pip install -r requirements.txt geladen werden. RyanBrady hat bereits gezeigt, wie Sie die Deploy-Anweisungen in einer einzigen Zeile aneinander reihen können:

# vor 15.1.0
virtualenv --no-site-packages --distribute .env &&\
    source .env/bin/activate &&\
    pip install -r requirements.txt

# nach der Veraltung einiger Argumente in 15.1.0
virtualenv .env && source .env/bin/activate && pip install -r requirements.txt

Persönlich lege ich diese einfach in ein Shell-Skript, das ich nach dem Git-Clonen oder Git-Pull ausführe.

Das Speichern des virtualenv-Verzeichnisses macht es auch etwas schwieriger, Pip-Upgrades zu handhaben, da Sie die aus dem Upgrade resultierenden Dateien manuell hinzufügen/entfernen und committen müssen. Mit einer requirements.txt-Datei ändern Sie einfach die entsprechenden Zeilen in requirements.txt und führen erneut pip install -r requirements.txt aus. Wie bereits erwähnt, reduziert dies auch das "Commit-Spamming".

4 Stimmen

Bitte beachten Sie, dass --distribute jetzt veraltet ist (zumindest in 15.1.0): --distribute VERALTET. Wird nur noch auswärtskompatibilität beibehalten. Diese Option hat keine Wirkung.

1 Stimmen

--no-site-packages ist in Version 15.1.0 ebenso veraltet, da dies jetzt Standard ist.

42voto

Yuji 'Tomita' Tomita Punkte 110771

Ich habe das Gleiche gemacht, bis ich begann, Bibliotheken zu verwenden, die je nach Umgebung unterschiedlich kompiliert sind, wie zum Beispiel PyCrypto. Mein PyCrypto-Mac würde auf Cygwin nicht funktionieren und auf Ubuntu nicht funktionieren.

Es wird zu einem absoluten Albtraum, das Repository zu verwalten.

Wie auch immer, ich fand es einfacher, das Pip Freeze & eine Anforderungsdatei zu verwalten, als alles in Git zu haben. Es ist auch sauberer, da man den Commit-Spam für Tausende von Dateien vermeiden kann, wenn diese Bibliotheken aktualisiert werden...

0 Stimmen

Hmm. Ich werde definitiv keine Probleme damit haben, wenn Dinge in verschiedenen Umgebungen unterschiedlich kompiliert werden. Ich denke, es ist wahrscheinlich besser, es nicht zu tun, um den Commit-Spam zu vermeiden.

0 Stimmen

@LylePratt: Ich denke das Gegenteil: Es ist besser, das gesamte virtualenv nicht im Repository zu haben, nur um Probleme mit solch großartigen Tools wie PyCrypto oder PIL zu vermeiden.

28voto

Torsten Engelbrecht Punkte 12832

Ich denke, eines der Hauptprobleme, das auftritt, ist, dass das virtualenv möglicherweise von anderen Personen nicht verwendet werden kann. Der Grund ist, dass es immer absolute Pfade verwendet. Wenn Ihr virtualenv beispielsweise in /home/lyle/myenv/ war, wird es davon ausgehen, dass alle anderen Personen, die dieses Repository verwenden, den gleichen absoluten Pfad haben (es muss genau der gleiche absolute Pfad sein). Sie können nicht davon ausgehen, dass alle Personen die gleiche Verzeichnisstruktur wie Sie verwenden.

Es ist besser, wenn jeder seine eigene Umgebung einrichtet (mit oder ohne virtualenv) und dort Bibliotheken installiert. Das macht Ihren Code auch über verschiedene Plattformen hinweg besser nutzbar (Linux/Windows/Mac), auch weil virtualenv in jedem von ihnen unterschiedlich installiert ist.

0 Stimmen

Dies ist der Grund, warum es keine gute Idee ist, ein Virtualenv im SCM zu halten, aber es ist erwägenswert, entweder etwas Ähnliches wie den Vorschlag von @RJBrady oder sogar ein bootstrap.py Skript in Betracht zu ziehen, da es wichtig ist, eine Möglichkeit zu haben, die gleiche Umgebung auf verschiedenen Maschinen wiederherzustellen, wenn man mit anderen Personen zusammenarbeitet.

0 Stimmen

Ich bin mir nicht wirklich sicher, ob das von Ihnen erwähnte Problem in meiner Situation genau ein Problem sein würde. Meine Django-App enthält eine .wsgi-Datei, die definiert, wo sich das Virtualenv relativ zu seinem Standort befindet (2 Verzeichnisse nach oben '../../ env'). Daher sollte das absolute Pfadproblem in meinem Szenario mich nicht negativ beeinflussen, oder?

0 Stimmen

Wenn Sie Ihre App immer mit WSGI ausführen, können Sie damit durchkommen. Wenn Sie den Entwicklungsserver verwenden (über manage.py), werden Sie auf jeden Fall auf Probleme stoßen.

27voto

Es ist keine gute Idee, irgendwelche umgebungsabhängigen Komponenten oder Einstellungen in Ihren Repositories einzuschließen, da einer der wichtigsten Aspekte der Verwendung eines Repositories vielleicht darin besteht, es mit anderen Entwicklern zu teilen. Hier ist, wie ich meine Entwicklungsumgebung auf einem Windows-PC (sagen wir, Win10) einrichten würde.

  1. Öffnen Sie Pycharm und wählen Sie auf der ersten Seite aus, um das Projekt aus Ihrem Source-Control-System zu überprüfen (in meinem Fall verwende ich GitHub)

  2. In Pycharm gehen Sie zu Einstellungen und wählen "Projektinterpreter" und wählen die Option, eine neue virtuelle Umgebung hinzuzufügen, Sie können sie "venv" nennen.

  3. Wählen Sie den Basis-Python-Interpreter, der sich unter C:\Benutzer{user}\AppData\Lokale\Programme\Python\Python36 befindet (stellen Sie sicher, dass Sie die entsprechende Version von Python basierend auf Ihrer Installation auswählen)

  4. Beachten Sie, dass Pycharm die neue virtuelle Umgebung erstellen und Python-Binärdateien und erforderliche Bibliotheken unter Ihrem venv-Ordner in Ihrem Projektordner kopieren wird.

  5. Lassen Sie Pycharm seinen Scanvorgang abschließen, da es Ihr Projektskelett neu erstellen/aktualisieren muss.

  6. schließen Sie den venv-Ordner von Ihren Git-Interaktionen aus (fügen Sie venv\ zur .gitignore-Datei in Ihrem Projektordner hinzu)

Bonus: Wenn Sie möchten, dass andere Personen (naja, fast einfach) alle Bibliotheken installieren, die Ihre Software benötigt, können Sie folgendes verwenden

pip freeze > requirements.txt

und geben Sie die Anleitung auf Ihrem Git an, damit die Personen den folgenden Befehl verwenden können, um alle erforderlichen Bibliotheken auf einmal herunterzuladen.

pip install -r requirements.txt

2 Stimmen

Vielleicht dumme Frage, muss pip nach diesem Befehl nicht "aufgetaut" werden, um den normalen Betrieb wieder aufzunehmen, oder?

3 Stimmen

@jbuddy_13 Nein, es ist irreführend zu glauben, dass man diesen Freeze wörtlich interpretieren sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X