ローカルマシンに、Fabricを使用してリモートマシンにコピー(および名前変更)したいディレクトリがあります。 put()
を使用してファイルをコピーできることは知っていますが、ディレクトリについてはどうですか。 scpを使用するのは簡単ですが、_fabfile.py
可能なら。
put
を使用することもできます(少なくとも1.0.0では):
local_path
は、相対または絶対ローカルファイルまたはディレクトリパスであり、シェルスタイルのワイルドカード、Pythonglobモジュールで理解されています。 .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 = ['[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
# ...
また、プロジェクトツールモジュールを見ます:fabric.contrib.project Documentation
これには、ソースディレクトリとターゲットディレクトリを取得するupload_project
関数があります。さらに良いことに、rsyncを使用するrsync_project
関数があります。これは、変更されたファイルのみを更新し、.git
ディレクトリを除外するなどのことを行うためのニースである "exclude"のような追加の引数を受け入れるためです。
例えば:
from fabric.contrib.project import rsync_project
def _deploy_ec2(loc):
rsync_project(local_dir=loc, remote_dir='/var/www', exclude='.git')
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 documentation を参照してください。
tGOの答えを拡張すると、Windowsシステムで使用する場合は、cygwinなどのrsyncのソースが必要です。