J'ai un répertoire sur ma machine locale que je voudrais copier sur une machine distante (et le renommer) à l'aide de Fabric. Je sais que je peux copier un fichier en utilisant put()
, mais qu'en est-il d'un répertoire. Je sais qu'il est assez facile en utilisant scp, mais je préférerais le faire à partir de mon fabfile.py
si possible.
Réponses
Trop de publicités?Vous pouvez utiliser put
pour que (au moins dans la version 1.0.0):
local_path
peut être relative ou absolue local de fichier ou chemin d'accès au répertoire, et peut contenir les jokers de style shell, telle que comprise par le Python glob module. Tilde expansion (tel que mis en œuvre par l'os.chemin d'accès.expanduser) est également effectuée.
Voir: http://docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put
Mise à jour: Cet exemple fonctionne très bien (pour moi) sur la version 1.0.0.:
from fabric.api import env
from fabric.operations import run, put
env.hosts = ['frodo@middleearth.com']
def copy():
# make sure the directory is there!
run('mkdir -p /home/frodo/tmp')
# our local 'testdirectory' - it may contain files or subdirectories ...
put('testdirectory', '/home/frodo/tmp')
# [frodo@middleearth.com] Executing task 'copy'
# [frodo@middleearth.com] run: mkdir -p /home/frodo/tmp
# [frodo@middleearth.com] put: testdirectory/HELLO -> \
# /home/frodo/tmp/testdirectory/HELLO
# [frodo@middleearth.com] put: testdirectory/WORLD -> \
# /home/frodo/tmp/testdirectory/WORLD
# ...
J'ai également examiné le Projet des Outils du module: tissu.contrib.projet [http://docs.fabfile.org/en/1.4.0/api/contrib/project.html]
Cela a un upload_project fonction qui prend source et le répertoire cible. Encore mieux, il y a un rsync_project fonction qui utilise rsync. C'est intéressant car il met à jour uniquement les fichiers qui ont changé et il accepte supplémentaire args comme "exclure" ce qui est agréable pour faire les choses comme à l'exclusion de votre .répertoire git.
Par exemple:
from fabric.contrib.project import rsync_project
def _deploy_ec2(loc):
rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')