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 que c’est assez facile d’utiliser scp , mais je préférerais le faire depuis mon fabfile.py
si possible.
Vous pouvez aussi utiliser put
(au moins dans la version 1.0.0):
local_path
peut être un fichier local relatif ou absolu ou un chemin directory, et peut contenir des caractères génériques style Shell, tels que compris par le module Python glob. Le développement de tilde (tel qu’implémenté par os.path.expanduser) est également effectué.
Voir: http://docs.fabfile.org/fr/1.0.0/api/core/operations.html#fabric.operations.put
Mise à jour: Cet exemple fonctionne bien (pour moi) sous 1.0.0.:
from fabric.api import env
from fabric.operations import run, put
env.hosts = ['[email protected]']
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')
# [[email protected]] Executing task 'copy'
# [[email protected]] run: mkdir -p /home/frodo/tmp
# [[email protected]] put: testdirectory/HELLO -> \
# /home/frodo/tmp/testdirectory/HELLO
# [[email protected]] put: testdirectory/WORLD -> \
# /home/frodo/tmp/testdirectory/WORLD
# ...
Je voudrais aussi regarder le module Outils de projet: fabric.contrib.project Documentation
Cela a une fonction upload_project
qui prend un répertoire source et un répertoire cible. Mieux encore, il existe une fonction rsync_project
qui utilise rsync. Ceci est agréable car il ne met à jour que les fichiers qui ont été modifiés et accepte des arguments supplémentaires tels que "exclude", ce qui est pratique pour exclure 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')
Pour ceux qui utilisent Fabric 2, put
ne peut plus télécharger de répertoires, mais uniquement des fichiers. De plus, rsync_project
ne fait plus partie du package Fabric principal. Le paquetage contrib
a été supprimé, comme expliqué ici . Désormais, rsync_project
a été renommé en rsync
et vous devez installer un autre package pour pouvoir l'utiliser:
pip install patchwork
Maintenant, en supposant que vous ayez déjà créé une connexion à votre serveur:
cxn = fabric.Connection('username@server:22')
Vous pouvez utiliser rsync
comme ci-dessous:
import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')
Veuillez vous référer à la documentation fabric-patchwork pour plus d'informations.
pour prolonger la réponse de TGO, vous avez besoin d'une source de rsync telle que cygwin si vous souhaitez l'utiliser un système Windows.