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


123

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

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

Done.

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

답변:


207

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 문서 에서 자세한 내용을 읽을 수 있습니다 .


9
따옴표는 필요하지 않습니다. 모든 인수는 문자열입니다. "이 프로세스에는 문자열 구문 분석이 포함되므로 모든 값은 Python 문자열로 끝나므로 그에 따라 계획을 세워야합니다. 직관적 인 구문을 찾을 수있는 경우 향후 Fabric 버전에서이를 개선 할 수 있기를 바랍니다.)"
Carl G

4
hello world그래도 따옴표 가 필요한 것 같습니까?
PEZ 2015

2
@PEZ 그게 사실이라면 터미널이나 패브릭의 명령 줄 파서가 공간을보고 그것이 해당 작업에 대한 모든 것의 끝이라고 생각하고 그것이 world새로운 작업 이라고 생각하기 때문에 해당 예제에서 따옴표가 필요할 것입니다 .
Adam Kerz 2015

1
또한 이것을 1 분 미만 사용한 후 Windows에서 작은 따옴표를 사용하면 작은 따옴표가 인수의 일부로 전달되지만 큰 따옴표가 먼저 제거된다는 것을 발견했습니다. 따라서 'hello world'파이썬 문자열은 'hello world'이지만 "hello world"결과는 hello world(대부분의 사람들이 원하는 것입니다).
Adam Kerz

5
이 프로세스에는 문자열 구문 분석이 포함되므로 bar=True패브릭 명령은 bar='True'부울 값이 아닌 것으로 전달됩니다.
Chemical Programmer

7

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

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

@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


7

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

함수 자체에서 호스트를 미리 정의하는 방법이 있습니까? 작업을 실행할 호스트 목록을 정의 할 수있는 @roles () 태그와 유사합니다.
Anish

2

특히 하위 프로세스를 사용하여 스크립트를 실행하는 경우 모든 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'

1

누군가 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.