79

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

4

3 回答 3

113

您也可以使用put它(至少在 1.0.0 中):

local_path可以是相对或绝对的本地文件或目录路径,并且可以包含shell 样式的通配符,正如 Python glob模块所理解的那样。波浪号扩展(由 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
# ...
于 2011-03-15T16:28:08.310 回答
32

我还会查看项目工具模块:fabric.contrib.project Documentation

这有一个upload_project函数,它需要一个源目录和目标目录。更好的是,有一个rsync_project使用 rsync 的函数。这很好,因为它只更新已更改的文件,并且它接受额外的参数,如“排除”,这对于排除您的.git目录等操作非常有用。

例如:

from fabric.contrib.project import rsync_project

def _deploy_ec2(loc):

    rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
于 2013-11-15T17:14:31.820 回答
22

对于使用 Fabric 2 的用户,put不能再上传目录,只能上传文件。此外, rsync_project不再是主 Fabric 包的一部分。该contrib软件包已被删除,如此处所述。现在,rsync_project已重命名为rsync,您需要安装另一个包才能使用它:

pip install patchwork

现在,假设您已经创建了与服务器的连接:

cxn = fabric.Connection('username@server:22')

您可以使用rsync如下:

import patchwork.transfers
patchwork.transfers.rsync(cxn, '/my/local/dir', target, exclude='.git')

有关更多信息,请参阅fabric-patchwork 文档

于 2019-02-13T10:24:07.537 回答