[python] 패브릭 작업에 매개 변수 전달

명령 줄에서 “fab”을 호출 할 때 패브릭 작업에 매개 변수를 어떻게 전달할 수 있습니까? 예를 들면 :

def task(something=''):
    print "You said %s" % something
$ fab task "hello"
You said hello

Done.

프롬프트없이이 작업을 수행 할 수 fabric.operations.prompt있습니까?



답변

Fabric 2 태스크 인수 문서 :

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Fabric 1.X는 작업에 인수를 전달하기 위해 다음 구문을 사용합니다.

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

Fabric 문서 에서 자세한 내용을 읽을 수 있습니다 .


답변

패브릭 인수는 매우 기본적인 문자열 구문 분석으로 이해되므로 보내는 방법에 약간주의해야합니다.

다음은 다음 테스트 함수에 인수를 전달하는 여러 방법의 몇 가지 예입니다.

@task
def test(*args, **kwargs):
    print("args:", args)
    print("named args:", kwargs)

$ fab "test:hello world"
('args:', ('hello world',))
('named args:', {})

$ fab "test:hello,world"
('args:', ('hello', 'world'))
('named args:', {})

$ fab "test:message=hello world"
('args:', ())
('named args:', {'message': 'hello world'})

$ fab "test:message=message \= hello\, world"
('args:', ())
('named args:', {'message': 'message = hello, world'})

방정식에서 쉘을 제거하기 위해 여기에 큰 따옴표를 사용하지만 일부 플랫폼에서는 작은 따옴표가 더 좋을 수 있습니다. 또한 fabric에서 구분 기호를 고려하는 문자의 이스케이프에 유의하십시오.

문서의 자세한 내용 :
http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


답변

Fabric 2에서는 작업 함수에 인수를 추가하기 만하면됩니다. 예를 들어, 전달하는 version작업에 인수를 deploy:

@task
def deploy(context, version):
    ...

다음과 같이 실행하십시오.

fab -H host deploy --version v1.2.3

Fabric은 옵션을 자동으로 문서화합니다.

$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]

Docstring:
  none

Options:
  -v STRING, --version=STRING


답변

특히 하위 프로세스를 사용하여 스크립트를 실행하는 경우 모든 Python 변수를 문자열로 전달해야합니다. 그렇지 않으면 오류가 발생합니다. 변수를 다시 int / boolean 유형으로 개별적으로 변환해야합니다.

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'


답변

누군가 fabric2의 한 작업에서 다른 작업으로 매개 변수를 전달하려는 경우 환경 사전을 사용하십시오.

@task
def qa(ctx):
  ctx.config.run.env['counter'] = 22
  ctx.config.run.env['conn'] = Connection('qa_host')

@task
def sign(ctx):
  print(ctx.config.run.env['counter'])
  conn = ctx.config.run.env['conn']
  conn.run('touch mike_was_here.txt')

그리고 실행 :

fab2 qa sign


답변