Ich denke darüber nach, die virtuelle Umgebung für eine Django-Web-App, die ich erstelle, in mein Git-Repository für die App zu stellen. Es scheint eine einfache Möglichkeit zu sein, die Bereitstellung einfach und unkompliziert zu halten. Gibt es einen Grund, warum ich das nicht tun sollte?
python
django
virtualenv
Lyle Pratt
quelle
quelle
pip install mysql-python
auf einem 64-Bit-Computer arbeiten und dann jemand mit einem 32-Bit-Computer versucht, ihn zu verwenden, funktioniert er nicht. Wie bei vielen Python-Modulen wird ein C-Modul verwendet, um die Leistung zu steigern. Ich stelle mir vor, Windows-> Linux würde auch nicht funktionieren.pip freeze
, dies zu tun. Das Problem ist, dass während Ihrer erzwungenen erneuten Bereitstellung niemand dafür bezahlt und für Zwischen-Upgrades ("Best Practice" -Wartung) auch niemand.--distribute
und--setuptools
sind jetzt nicht mehr verfügbar . (verteilen, das war eine Gabelung von Setuptools, die vor langer Zeit wieder zusammengeführt wurde).--no-site-packages
ist DEPRECATED, es ist jetzt das StandardverhaltenWenn Sie das Verzeichnis virtualenv in git speichern, können Sie, wie bereits erwähnt, die gesamte App bereitstellen, indem Sie einfach einen git-Klon ausführen (plus Apache / mod_wsgi installieren und konfigurieren). Ein potenziell bedeutendes Problem bei diesem Ansatz ist, dass unter Linux der vollständige Pfad in den Aktivierungs-, django-admin.py-, easy_install- und pip-Skripten des venv fest codiert wird. Dies bedeutet, dass Ihre virtuelle Umgebung nicht vollständig funktioniert, wenn Sie einen anderen Pfad verwenden möchten, um möglicherweise mehrere virtuelle Hosts auf demselben Server auszuführen. Ich denke, die Website funktioniert möglicherweise tatsächlich mit den in diesen Dateien falschen Pfaden, 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, damit Sie während der Bereitstellung die virtuelle Umgebung erstellen und die erforderlichen Pip-Installationen durchführen können. Normalerweise werden Benutzer ausgeführt
pip freeze
, um die Liste abzurufen, und sie dann in einer Datei mit dem Namen require.txt gespeichert. Es kann mit geladen werdenpip install -r requirements.txt
. RyanBrady hat bereits gezeigt, wie Sie die Bereitstellungsanweisungen in einer einzigen Zeile aneinanderreihen können:Persönlich habe ich diese einfach in ein Shell-Skript eingefügt, das ich nach dem Git-Klon oder Git-Pull ausführe.
Das Speichern des Verzeichnisses virtualenv macht es auch etwas schwieriger, Pip-Upgrades durchzuführen, da Sie die aus dem Upgrade resultierenden Dateien manuell hinzufügen / entfernen und festschreiben müssen. Bei einer Datei "resources.txt" ändern Sie einfach die entsprechenden Zeilen in "resources.txt" und führen sie erneut aus
pip install -r requirements.txt
. Wie bereits erwähnt, reduziert dies auch das "Festschreiben von Spam".quelle
--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
--no-site-packages
ist auch in 15.1.0 veraltet, da dies jetzt die Standardeinstellung ist.Früher habe ich dasselbe gemacht, bis ich angefangen habe, Bibliotheken zu verwenden, die je nach Umgebung wie PyCrypto unterschiedlich kompiliert werden. Mein PyCrypto-Mac würde unter Cygwin unter Ubuntu nicht funktionieren.
Es wird zu einem Albtraum, das Repository zu verwalten.
In beiden Fällen war es für mich einfacher, das Einfrieren von Pip und eine Anforderungsdatei zu verwalten, als alles in Git zu haben. Es ist auch sauberer, da Sie den Commit-Spam für Tausende von Dateien vermeiden können, wenn diese Bibliotheken aktualisiert werden ...
quelle
Ich denke, eines der Hauptprobleme ist, dass die virtuelle Umgebung möglicherweise nicht von anderen Personen verwendet werden kann. Grund ist, dass immer absolute Pfade verwendet werden. Wenn Sie also beispielsweise in virtualenv waren
/home/lyle/myenv/
, wird für alle anderen Personen, die dieses Repository verwenden, dasselbe angenommen (es muss genau derselbe absolute Pfad sein). Sie können nicht davon ausgehen, dass Personen dieselbe Verzeichnisstruktur wie Sie verwenden.Besser ist es, wenn jeder seine eigene Umgebung (mit oder ohne Virtualenv) einrichtet und dort Bibliotheken installiert. Dadurch können Sie Code auch auf verschiedenen Plattformen (Linux / Windows / Mac) besser verwenden, da virtualenv in jeder Plattform unterschiedlich installiert ist.
quelle
manage.py
) verwenden, werden Sie mit Sicherheit auf Probleme stoßen.Ich verwende die Antwort von David Sickmiller mit etwas mehr Automatisierung. Ich erstelle eine (nicht ausführbare) Datei auf der obersten Ebene meines Projekts
activate
mit dem folgenden Inhalt:(Gemäß Davids Antwort wird davon ausgegangen
pip freeze > requirements.txt
, dass Sie Ihre Liste der Anforderungen auf dem neuesten Stand halten.)Das Obige gibt die allgemeine Idee; Das eigentliche Aktivierungsskript ( Dokumentation ), das ich normalerweise verwende, ist etwas ausgefeilter und bietet eine
-q
(leise) Option, die Verwendung,python
wenn siepython3
nicht verfügbar ist usw.Dies kann dann aus jedem aktuellen Arbeitsverzeichnis bezogen werden und wird ordnungsgemäß aktiviert, wobei bei Bedarf zuerst die virtuelle Umgebung eingerichtet wird. Mein Testskript der obersten Ebene enthält normalerweise Code in dieser Richtung, sodass er ausgeführt werden kann, ohne dass der Entwickler ihn zuerst aktivieren muss:
Die Beschaffung ist hier
./activate
nichtactivate
wichtig, da letztere andereactivate
auf Ihrem Weg finden, bevor sie die im aktuellen Verzeichnis finden.quelle
[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }
um festzustellen, ob das Skript im Gegensatz zu Sourcing ausgeführt wurdeEs ist keine gute Idee, umgebungsabhängige Komponenten oder Einstellungen in Ihre Repos aufzunehmen, da einer der Schlüsselaspekte bei der Verwendung eines Repos darin besteht, sie möglicherweise mit anderen Entwicklern zu teilen. So würde ich meine Entwicklungsumgebung auf einem Windows-PC einrichten (z. B. Win10).
Öffnen Sie Pycharm und wählen Sie auf der ersten Seite das Projekt aus Ihrem Versionsverwaltungssystem aus (in meinem Fall verwende ich Github).
Navigieren Sie in Pycharm zu den Einstellungen, wählen Sie "Projektinterpreter" und wählen Sie die Option zum Hinzufügen einer neuen virtuellen Umgebung. Sie können sie "venv" nennen.
Wählen Sie den Basis-Python-Interpreter aus, der sich unter C: \ Users {user} \ AppData \ Local \ Programs \ Python \ Python36 befindet (stellen Sie sicher, dass Sie die entsprechende Version von Python basierend auf Ihrer Installation auswählen).
Beachten Sie, dass Pycharm die neue virtuelle Umgebung erstellt und Python-Binärdateien und erforderliche Bibliotheken in Ihren venv-Ordner in Ihrem Projektordner kopiert.
Lassen Sie Pycharm den Scanvorgang abschließen, um Ihr Projektskelett neu zu erstellen / zu aktualisieren
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 Benutzer alle (einfach, fast einfach) alle Bibliotheken installieren, die Ihre Software benötigt, können Sie sie verwenden
und fügen Sie die Anweisung in Ihr Git ein, damit Benutzer den folgenden Befehl verwenden können, um alle erforderlichen Bibliotheken gleichzeitig herunterzuladen.
quelle
Wenn Sie wissen, auf welchen Betriebssystemen Ihre Anwendung ausgeführt wird, würde ich für jedes System eine virtuelle Umgebung erstellen und diese in mein Repository aufnehmen. Dann würde ich meine Anwendung erkennen lassen, auf welchem System sie ausgeführt wird, und die entsprechende virtuelle Umgebung verwenden.
Das System könnte zB anhand des Plattformmoduls identifiziert werden .
Tatsächlich mache ich das mit einer von mir geschriebenen internen Anwendung, zu der ich bei Bedarf schnell die virtuelle Umgebung eines neuen Systems hinzufügen kann. Auf diese Weise muss ich mich nicht darauf verlassen, dass pip die für meine Anwendung erforderliche Software erfolgreich herunterladen kann. Ich muss mich auch nicht um die Kompilierung von zB psycopg2 kümmern, die ich benutze.
Wenn Sie nicht wissen, auf welchem Betriebssystem Ihre Anwendung ausgeführt werden kann, sollten Sie wahrscheinlich besser verwenden,
pip freeze
wie in anderen Antworten hier vorgeschlagen.quelle
Ich denke, das Beste ist, die virtuelle Umgebung in einem Pfad innerhalb des Repository-Ordners zu installieren. Vielleicht ist es besser, ein der Umgebung zugeordnetes Unterverzeichnis zu verwenden (ich habe versehentlich mein gesamtes Projekt gelöscht, als ich die Installation einer virtuellen Umgebung im Repository-Stamm erzwang Ordner, gut, dass ich das Projekt in seiner neuesten Version in Github gespeichert hatte).
Entweder das automatisierte Installationsprogramm oder die Dokumentation sollten den Pfad für die virtuelle Umgebung als relativen Pfad angeben. Auf diese Weise treten keine Probleme auf, wenn Sie das Projekt für andere Personen freigeben. Über die Pakete sollten die verwendeten Pakete von gespeichert werden
pip freeze -r requirements.txt
.quelle
Wenn Sie nur die Entwicklungsumgebung einrichten, verwenden Sie die Pip-Freeze-Datei caz, die das Git-Repo sauber macht.
Wenn Sie dann eine Produktionsbereitstellung durchführen, checken Sie den gesamten venv-Ordner ein. Dadurch wird Ihre Bereitstellung reproduzierbarer, Sie benötigen diese libxxx-dev-Pakete nicht und vermeiden Internetprobleme.
Es gibt also zwei Repos. Eine für Ihren Hauptquellcode, die eine Anforderungen.txt enthält. Und ein env repo, das den gesamten venv-Ordner enthält.
quelle