Postscript: La méthode de http://qiita.com/NPoi/items/46364461f0ab76e986c3 est plus intelligente!
Le tissu n'est-il pas lent? Utilisons rsync. Dans le cas du transfert d'un répertoire entier avec de nombreux fichiers statiques tels que des images, HTML et JS, le temps d'exécution de fabric est radicalement différent, je vais donc le présenter. (Nous supposons que les personnes qui utilisent le tissu dans une certaine mesure)
C'est une fonctionnalité officielle fournie par Fabric, donc facile à utiliser.
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
)
Après rsync en tant qu'utilisateur non root, vous pouvez faire mv
ou cp -r
, mais la bonne chose à propos de rsync est que vous ne pouvez transférer que les différences, j'ai donc créé cette fonction. Les arguments sont alignés avec rsync_project
.
Le comportement est de rsync une fois vers / tmp / (valeur de hachage du nom du répertoire) / puis sudo rsync
sur le serveur.
Cela dépend de la fonction is_dir de fabtools, vous avez donc besoin de 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