ファブリックを使用して rsync ラッパーを作成しています。変数 env.host_string は execute() によってタスクを実行するように設定されます。env.host_string を取得するには、まず run('pwd') を実行し、rsync を実行します。
条件 src == env.host_string などのチェックポイントが到着する前に、ユーザーが env.hosts を設定したことを確認することは可能ですか?
from fabric.api import run, env, task, abort
from string import Template
@task
def sync_to_same_dir(src, path):
env.host_string
cmd_template = Template("""rsync --dry-run -e ssh -avr $user@$src_host:$path/ $path/""")
if path.endswith("/"):
path = path[:-1]
run("pwd") # it's a work around
if src == env.host_string:
abort("cannot rysnc to the same host")
cmd = cmd_template.substitute(path=path, user=env.user, src_host=src)
run(cmd)
fabricのソースコードから答えを見つけました。簡単なアイデアがあります:必要に応じてチェックホストを実行する方法は?
@needs_host
def put(local_path=None, remote_path=None, use_sudo=False,
mirror_local_mode=False, mode=None):
"""
Upload one or more files to a remote host.
"""
ユーザーがホストを割り当てていない場合、ホストを尋ねるプロンプトが表示される needs_host をトレースします。
No hosts found. Please specify (single) host string for connection:
タスクを次のように書き直すことができます。
from fabric.network import needs_host
@task
@needs_host
def the_task_needs_host(): pass