Nachtrag: Die Methode von http://qiita.com/NPoi/items/46364461f0ab76e986c3 ist intelligenter!
Ist der Stoff nicht langsam? Verwenden wir rsync. Bei der Übertragung eines gesamten Verzeichnisses mit vielen statischen Dateien wie Bildern, HTML und JS ist die Ausführungszeit von Fabric erheblich unterschiedlich, daher werde ich sie vorstellen. (Ich gehe von Leuten aus, die zum Teil Stoff verwenden)
Es ist eine offizielle Funktion von Stoff, daher ist es einfach zu bedienen.
from fabric.contrib.project import rsync_project
@task
def hoge():
rsync_project(
local_dir='./mydir',
remote_dir='/usr/local/destination/mydir',
exclude=['.DS_Tore', '*.tmp'],
delete=True
)
Nach dem Synchronisieren als Nicht-Root-Benutzer können Sie "mv" oder "cp -r" ausführen. Das Schöne an rsync ist jedoch, dass Sie nur die Unterschiede übertragen können. Deshalb habe ich diese Funktion erstellt. Die Argumente sind auf "rsync_project" ausgerichtet.
Die Operation besteht darin, einmal mit / tmp / (Hash-Wert des Verzeichnisnamens) / und dann "sudo rsync" auf dem Server zu synchronisieren.
Es hängt von der is_dir-Funktion von fabtools ab, daher benötigen Sie pip install fabtools
import hashlib
from fabric.api import local, run, sudo
from fabric.contrib.project import rsync_project
from fabtools.files import is_dir
def root_rsync(local_dir, remote_dir, exclude=[], delete=False):
def _end_with_slash(dir_path):
if dir_path[-1] == '/':
return dir_path
else:
return dir_path + '/'
local_dir = _end_with_slash(local_dir)
remote_dir = _end_with_slash(remote_dir)
m = hashlib.md5()
m.update(remote_dir)
me = local('whoami', capture=True)
remote_tmp_dir = '/tmp/%s/%s/' % (me, m.hexdigest())
run('mkdir -p %s' % remote_tmp_dir)
if is_dir(remote_dir):
run('rsync -a %s %s' % (remote_dir, remote_tmp_dir)) # already exists
rsync_project(
remote_dir=remote_tmp_dir,
local_dir=local_dir,
exclude=exclude,
delete=delete
)
sudo('rsync -a %s %s' % (remote_tmp_dir, remote_dir))
Recommended Posts