如何使用Fabric将目录复制到远程计算机?

我在本地机器上有一个目录,我想使用Fabric将其复制到远程机器(并对其进行重命名)。 我知道我可以使用put()复制文件,但是一个目录呢。 我知道使用scp很容易,但如果可能的话,我宁愿从我的fabfile.py

你也可以使用put (至less在1.0.0):

local_path可能是相对或绝对的本地文件或目录path ,并且可能包含shell样式的通配符 ,正如Python glob模块所理解的。 Tilde扩展(由os.path.expanduser实现)也被执行。

请参阅: http : //docs.fabfile.org/en/1.0.0/api/core/operations.html#fabric.operations.put


更新:这个例子工作正常(对我来说)在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 # ... 

我也看看项目工具模块:fabric.contrib.project 文档

这有一个upload_project函数,它接受一个源和目标目录。 更好的是,有一个使用rsync的rsync_project函数。 这是很好的,因为它只更新已经改变的文件,并且接受像“排除”这样的额外参数,这对于排除.git目录是很好的。

例如:

 from fabric.contrib.project import rsync_project def _deploy_ec2(loc): rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')