Ich möchte mein Fabric-Skript lokal ausführen, das sich wiederum bei meinem Server anmeldet, den Benutzer zum Bereitstellen wechselt, die Projekte .virtualenv aktiviert, wodurch das Verzeichnis zum Projekt geändert und ein Git-Pull ausgegeben wird.
def git_pull():
sudo('su deploy')
# here i need to switch to the virtualenv
run('git pull')
Normalerweise verwende ich den Befehl workon von virtualenvwrapper, der die Aktivierungsdatei als Quelle verwendet, und die Postaktivierungsdatei legt mich im Projektordner ab. In diesem Fall scheint es so zu sein, dass die Kontrolle dem Fabric übertragen wird, da Fabric von der Shell aus ausgeführt wird. Daher kann ich die in '$ source ~ / .virtualenv / myvenv / bin / enabled' integrierte Bash-Quelle nicht verwenden.
Hat jemand ein Beispiel und eine Erklärung, wie sie das gemacht haben?
python
virtualenv
fabric
automated-deploy
Thomas Schreiber
quelle
quelle
workon
alsprefix
?Antworten:
Im Moment können Sie das tun, was ich tue, was klobig ist, aber einwandfrei funktioniert * (diese Verwendung setzt voraus, dass Sie virtualenvwrapper verwenden - was Sie auch sein sollten -, aber Sie können den von Ihnen erwähnten längeren Quellruf einfach ersetzen , wenn nicht):
Seit Version 1.0 verfügt Fabric über einen
prefix
Kontextmanager, der diese Technik verwendet, sodass Sie beispielsweise Folgendes tun können:* Es kann Fälle geben, in denen die Verwendung des
command1 && command2
Ansatzes Sie in die Luft jagt, z. B. wenn eincommand1
Fehler auftritt (command2
niemals ausgeführt wird) oder wenn ercommand1
nicht ordnungsgemäß maskiert wird und spezielle Shell-Zeichen enthält, und so weiter.quelle
workon
aber unbekannt durchsh
. Wie können wir Stoff anweisen, stattdessen Bash zu verwenden?source venv/bin/activate
. Es ist einfacher und funktioniert sofort.workon
ist eine zusätzliche Abhängigkeit, und selbst wenn sie installiert ist, müssen Sie sie hinzufügen.bashrc
- zu kompliziert für Fabric-Bereitstellungen.Als Aktualisierung der Prognose von bitprophet: Mit Fabric 1.0 können Sie prefix () und Ihre eigenen Kontextmanager verwenden.
quelle
source
aber unbekannt durchsh
. Wie können wir Stoff anweisen, stattdessen Bash zu verwenden?.
anstelle vonsource
cd()
wenn Sie den Pfad zuactivate
in vollständig angebenprefix()
?prefix()
es dort keine CD zu geben scheint - siehe diese Dokumente , die dasselbe tun. Wir möchtencd
dort, damit dieseyield
Befehle , wenn wir andere Befehle ausführen (pip freeze
in meinem Beispiel), relativ zu diesem Verzeichnis sein können.Ich verwende nur eine einfache Wrapper-Funktion virtualenv (), die anstelle von run () aufgerufen werden kann. Der CD-Kontext-Manager wird nicht verwendet, daher können relative Pfade verwendet werden.
quelle
virtualenvwrapper
kann dies etwas einfacher machenVerwenden des Ansatzes von @ nh2 (dieser Ansatz funktioniert auch bei Verwendung
local
, jedoch nur für Virtualenvwrapper-Installationen, in denenworkon
sich$PATH
Windows befindet).Oder stellen Sie Ihre Fab-Datei bereit und führen Sie diese lokal aus. Mit diesem Setup können Sie die virtuelle Umgebung für lokale oder Remote-Befehle aktivieren. Dieser Ansatz ist leistungsstark, da er die
local
Unfähigkeit umgeht, .bashrc mitbash -l
folgenden Funktionen auszuführen :quelle
Dies ist mein Ansatz zur Verwendung
virtualenv
mit lokalen Bereitstellungen.Mit dem Pfad () -Kontextmanager von Fabric können Sie
pip
oderpython
mit Binärdateien von virtualenv ausführen.quelle
Vielen Dank an alle Antworten und ich möchte noch eine Alternative dazu hinzufügen. Es gibt ein Modul, Fabric-Virtualenv , das die Funktion als denselben Code bereitstellen kann:
Fabric-Virtualenv nutzt
fabric.context_managers.prefix
, was ein guter Weg sein könnte :)quelle
Wenn Sie die Pakete in der Umgebung installieren oder Befehle gemäß den Paketen ausführen möchten, die Sie in der Umgebung haben, habe ich diesen Hack gefunden, um mein Problem zu lösen, anstatt komplexe Fabric-Methoden zu schreiben oder neue Betriebssystempakete zu installieren:
Auf diese Weise müssen Sie möglicherweise die Umgebung nicht aktivieren, können jedoch Befehle unter der Umgebung ausführen.
quelle
Hier ist der Code für einen Dekorateur, der zur Verwendung der virtuellen Umgebung für alle Run- / Sudo-Aufrufe führt:
Um den Dekorateur zu verwenden, ist die Reihenfolge der Dekorateure wichtig:
quelle
Dieser Ansatz hat bei mir funktioniert, Sie können ihn auch anwenden.
Angenommen, es
venv
handelt sich um Ihr virtuelles env-Verzeichnis, und fügen Sie diese Methode gegebenenfalls hinzu.quelle