명령 줄에서 “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