인수

문제 신고 소스 보기

명령줄의 일부 또는 전체를 빌드하는 데 필요한 데이터를 메모리 효율적인 방식으로 캡슐화하는 객체입니다.

작업에 전이 종속성에서 누적된 값을 포함하는 큰 명령줄이 필요한 경우가 많습니다. 예를 들어 링커 명령줄은 연결 중인 모든 라이브러리에 필요한 모든 객체 파일을 나열할 수 있습니다. 이러한 전이 데이터는 여러 타겟에서 공유할 수 있도록 depset에 저장하는 것이 좋습니다. 그러나 규칙 작성자가 작업 명령줄을 구성하기 위해 이러한 depset를 문자열 목록으로 변환해야 한다면 이 메모리 공유 최적화를 무효화할 것입니다.

이러한 이유로 작업 구성 함수는 문자열 외에도 Args 객체도 허용합니다. 각 Args 객체는 데이터 조작을 위한 선택적 변환과 함께 문자열과 depset의 연결을 나타냅니다. Args 객체는 명령줄을 계산할 때인 실행 단계까지 캡슐화된 depset을 처리하지 않습니다. 따라서 분석 단계가 완료될 때까지 비용이 많이 드는 복사를 지연하는 데 도움이 됩니다. 자세한 내용은 실적 최적화 페이지를 참고하세요.

Argsctx.actions.args()를 호출하여 구성됩니다. ctx.actions.run() 또는 ctx.actions.run_shell()arguments 매개변수로 전달할 수 있습니다. Args 객체의 각 변형은 최종 명령줄에 값을 추가합니다.

map_each 기능을 사용하면 항목이 문자열로 변환되는 방식을 맞춤설정할 수 있습니다. map_each 함수를 제공하지 않는 경우 표준 변환은 다음과 같습니다.

  • 이미 문자열인 값은 그대로 둡니다.
  • File 객체가 File.path 값으로 변환됩니다.
  • 다른 모든 유형은 지정되지 않은 방식으로 문자열로 변환됩니다. 따라서 문자열이나 File 유형이 아닌 값을 add()에 전달해서는 안 되며, add_all() 또는 add_joined()에 전달하는 경우에는 map_each 함수를 제공해야 합니다.

문자열 형식 지정 (add*() 메서드의 format, format_each, format_joined 매개변수)을 사용할 때 형식 템플릿은 문자열에 대한 %-대체와 동일한 방식으로 해석됩니다. 단, 템플릿에 정확히 하나의 대체 자리표시자가 있어야 하고 %s이어야 합니다. 리터럴 백분율은 %%로 이스케이프 처리할 수 있습니다. 위에 따라 값이 문자열로 변환된 후에 서식이 적용됩니다.

add*() 메서드에는 추가 위치 매개변수인 '인수 이름' 문자열을 나머지 인수 앞에 삽입할 수 있는 대체 형식이 있습니다. add_alladd_joined의 경우 시퀀스가 비어 있는 것으로 확인되면 추가 문자열이 추가되지 않습니다. 예를 들어 동일한 사용법으로 지정된 시퀀스에 val1..val3가 포함되어 있는지 또는 비어 있는지에 따라 명령줄에 --foo val1 val2 val3 --bar 또는 --bar만 추가할 수 있습니다.

명령줄의 크기가 시스템에서 허용하는 최대 크기보다 더 길게 커질 수 있는 경우, 인수가 매개변수 파일로 스필링될 수 있습니다. use_param_file()set_param_file_format()을 참고하세요.

예: 명령줄을 생성한다고 가정해 보겠습니다.

--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
다음 Args 객체를 사용할 수 있습니다.
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)

구성원

추가

Args Args.add(arg_name_or_value, value=unbound, *, format=None)

이 명령줄에 인수를 추가합니다.

매개변수

매개변수 설명
arg_name_or_value 필수
위치 매개변수 2개가 전달되면 인수 이름으로 해석됩니다. 인수 이름은 처리 없이 값 앞에 추가됩니다. 위치 매개변수를 하나만 전달하면 value로 해석됩니다 (아래 참고).
value 기본값은 unbound입니다.
추가할 객체입니다. 이는 위에 언급된 표준 변환을 사용하여 문자열로 변환됩니다. 이 함수에는 map_each 매개변수가 없으므로 value은 문자열 또는 File여야 합니다. 목록, 튜플, depset 또는 디렉터리 File는 이 메서드 대신 add_all() 또는 add_joined()에 전달해야 합니다.
format string 또는 None. 기본값은 None입니다.
value의 문자열화된 버전에 적용할 형식 문자열 패턴입니다.

add_all

Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)

이 명령줄에 여러 인수를 추가합니다. 항목이 실행 단계 중에 느리게 처리됩니다.

다음 단계에 따라 추가할 인수 목록에서 대부분의 처리가 이루어집니다.

  1. 각 디렉터리 File 항목은 해당 디렉터리에 재귀적으로 포함된 모든 File로 대체됩니다.
  2. map_each가 제공되면 각 항목에 적용되고 결과 문자열 목록이 연결되어 초기 인수 목록을 형성합니다. 그렇지 않으면 초기 인수 목록은 각 항목에 표준 변환을 적용한 결과입니다.
  3. 목록의 각 인수는 format_each(있는 경우)로 형식이 지정됩니다.
  4. uniquify가 true이면 중복 인수가 삭제됩니다. 그 첫 번째 항목이 그대로 남아 있게 됩니다.
  5. before_each 문자열이 제공되면 목록의 각 기존 인수 앞에 새 인수로 삽입됩니다. 이렇게 하면 이 시점에 추가되는 인수의 수가 사실상 두 배가 됩니다.
  6. 목록이 비어 있고 omit_if_empty가 true (기본값)인 경우를 제외하고, 인수 이름과 terminate_with가 주어지면 각각 첫 번째와 마지막 인수로 삽입됩니다.
빈 문자열은 이러한 모든 처리 단계가 적용되는 유효한 인수입니다.

매개변수

매개변수 설명
arg_name_or_values 필수
위치 매개변수 2개가 전달되면 인수 이름으로 해석됩니다. 인수 이름은 처리 없이 별도의 인수로 values 앞에 추가됩니다. omit_if_empty가 true (기본값)이고 다른 항목이 추가되지 않으면 (values가 비어 있거나 모든 항목이 필터링된 경우) 이 인수 이름이 추가되지 않습니다. 위치 매개변수를 하나만 전달하면 values로 해석됩니다 (아래 참고).
values sequence 또는 depset. 기본값은 unbound
항목이 추가될 목록, 튜플 또는 depset입니다.
map_each 호출 가능 또는 None. 기본값은 None입니다.
각 항목을 0개 이상의 문자열로 변환하는 함수로, 추가하기 전에 추가로 처리할 수 있습니다. 이 매개변수를 제공하지 않으면 표준 변환이 사용됩니다.

이 함수는 한 개 또는 두 개의 위치 인수(변환할 항목, 선택적 DirectoryExpander)를 전달합니다. 두 번째 인수는 제공된 함수가 기본 제공이 아닌 사용자 정의 함수이고 둘 이상의 매개변수를 선언하는 경우에만 전달됩니다.

반환 값의 유형은 항목에 대해 생성할 인수 수에 따라 다릅니다.

  • 각 항목이 하나의 문자열로 변환되는 일반적인 경우 함수는 이 문자열을 반환해야 합니다.
  • 항목을 완전히 필터링하려면 이 함수는 None를 반환해야 합니다.
  • 항목이 여러 문자열로 변환되면 함수는 이러한 문자열의 목록을 반환합니다.
단일 문자열 또는 None를 반환하는 것은 각각 길이가 1인 목록이나 길이가 0인 목록을 반환하는 것과 동일한 효과가 있습니다. 그러나 필요하지 않은 목록을 만들지 않는 것이 더 효율적이고 읽기 쉽습니다.

일반적으로 expand_directories=True가 설정되면 디렉터리인 항목이 해당 콘텐츠로 자동 확장됩니다. 그러나 이 방법은 다른 값 내에 포함된 디렉터리는 확장하지 않습니다. 예를 들어 항목이 디렉터리를 필드로 갖는 구조체인 경우 확장되지 않습니다. 이 상황에서는 지정된 디렉터리의 파일을 수동으로 가져오기 위해 DirectoryExpander 인수를 적용할 수 있습니다.

대규모 분석 단계 데이터 구조가 의도치 않게 실행 단계에 저장되지 않도록 하려면 최상위 def 문으로 map_each 함수를 선언해야 합니다. 기본적으로 중첩된 함수 클로저가 아닐 수 있습니다.

경고: map_each 호출 중에 실행되는 print() 문은 표시되는 출력을 생성하지 않습니다.

format_each string 또는 None이며 기본값은 None입니다.
map_each 함수에서 반환된 각 문자열에 적용되는 선택적 형식 문자열 패턴입니다. 형식 문자열에는 정확히 하나의 '%s' 자리표시자가 있어야 합니다.
before_each string 또는 None, 기본값은 None입니다.
values에서 파생된 각 인수가 추가되기 전에 추가할 선택적 인수입니다.
omit_if_empty 기본값은 True입니다.
true인 경우 values에서 파생된 인수가 없으면 추가 처리가 이루어지지 않으며 명령줄이 변경되지 않습니다. false인 경우 인수 이름과 terminate_with(제공되는 경우)는 다른 인수가 있는지 여부와 관계없이 계속 추가됩니다.
uniquify 기본값은 False입니다.
true인 경우 values에서 파생된 중복 인수는 생략됩니다. 각 인수의 처음 일치하는 부분만 유지됩니다. 일반적으로 이 기능은 depset가 이미 중복을 생략하기 때문에 필요하지 않지만 map_each가 여러 항목에 대해 동일한 문자열을 내보내는 경우 유용할 수 있습니다.
expand_directories 기본값은 True입니다.
true인 경우 values의 모든 디렉터리가 단순 파일 목록으로 확장됩니다. 이는 map_each가 적용되기 전에 발생합니다.
terminate_with string 또는 None, 기본값은 None입니다.
다른 모든 인수 뒤에 추가할 선택적 인수입니다. omit_if_empty가 true (기본값)이고 다른 항목이 추가되지 않으면 이 인수가 추가되지 않습니다 (values가 비어 있거나 모든 항목이 필터링되는 경우).
allow_closure 기본값은 False입니다.
true인 경우 map_each과 같은 함수 매개변수에서 클로저를 사용할 수 있습니다. 일반적으로 이 작업은 필요하지 않으며 대규모 분석 단계의 데이터 구조를 실행 단계에 유지할 위험이 있습니다.

add_joined

Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)

구분자를 사용하여 여러 값을 연결하여 이 명령줄에 인수를 추가합니다. 항목이 실행 단계 중에 느리게 처리됩니다.

처리는 add_all()와 비슷하지만 values에서 파생된 인수 목록은 join_with.join(...)가 사용하는 것처럼 단일 인수로 결합한 다음 지정된 format_joined 문자열 템플릿을 사용하여 형식이 지정됩니다. add_all()와 달리 before_each 또는 terminate_with 매개변수는 없습니다. 항목을 단일 인수로 결합할 때 일반적으로 유용하지 않기 때문입니다.

필터링 후 인수로 조인할 문자열이 없고 omit_if_empty가 true (기본값)이면 처리가 완료되지 않습니다. 조인할 문자열이 없지만 omit_if_empty이 false인 경우 조인된 문자열은 빈 문자열이 됩니다.

매개변수

매개변수 설명
arg_name_or_values 필수
위치 매개변수 2개가 전달되면 인수 이름으로 해석됩니다. 인수 이름은 처리 없이 values 앞에 추가됩니다. omit_if_empty가 true (기본값)이고 values에서 파생되어 함께 조인할 문자열이 없는 경우 이 인수는 추가되지 않습니다 (values가 비어 있거나 모든 항목이 필터링된 경우 발생할 수 있음). 위치 매개변수를 하나만 전달하면 values로 해석됩니다 (아래 참고).
values sequence 또는 depset. 기본값은 unbound
항목이 조인될 목록, 튜플 또는 depset입니다.
join_with 필수
map_eachformat_each를 적용하여 얻은 문자열을 string.join()와 동일한 방식으로 조인하는 데 사용되는 구분 기호 문자열입니다.
map_each 호출 가능 또는 None. 기본값은 None입니다.
add_all와 동일합니다.
format_each string 또는 None, 기본값은 None입니다.
add_all와 동일합니다.
format_joined string 또는 None이며 기본값은 None입니다.
조인된 문자열에 적용되는 형식 문자열 패턴(선택사항)입니다. 형식 문자열에는 정확히 하나의 '%s' 자리표시자가 있어야 합니다.
omit_if_empty 기본값은 True입니다.
true인 경우 함께 조인할 문자열이 없으면 (values이 비어 있거나 모든 항목이 필터링되어) 추가적인 모든 처리가 중단되고 명령줄이 변경되지 않습니다. false이면 함께 결합할 문자열이 없더라도 두 개의 인수가 추가됩니다. 인수 이름 뒤에 빈 문자열 (0개 문자열의 논리적 조인)이 옵니다.
uniquify 기본값은 False입니다.
add_all와 동일합니다.
expand_directories 기본값은 True입니다.
add_all와 동일합니다.
allow_closure 기본값은 False입니다.
add_all와 동일합니다.

set_param_file_format

Args Args.set_param_file_format(format)

매개변수 파일(사용되는 경우)의 형식을 설정합니다.

매개변수

매개변수 설명
format 필수
다음 중 하나여야 합니다.
  • 'multiline': 각 항목 (인수 이름 또는 값)이 파라미터 파일에 그대로 쓰여지며 뒤에 줄바꿈 문자가 추가됩니다.
  • "shell": "multiline"과 동일하지만 항목은 쉘 따옴표로 묶여 있습니다.
  • "flag_per_line": "multiline"과 동일하지만 (1) 매개변수 파일에 '--'로 시작하는 플래그만 작성되고 (2) 플래그 값이 있는 경우 같은 행에 '=' 구분자로 작성됩니다. 이는 Abseil 플래그 라이브러리에서 예상하는 형식입니다.

호출하지 않을 경우 기본값은 'shell'입니다.

use_param_file

Args Args.use_param_file(param_file_arg, *, use_always=False)

인수를 매개변수 파일로 내보내 매개변수 파일에 대한 포인터로 대체합니다. 인수가 시스템의 명령어 길이 제한에 비해 너무 클 수 있는 경우 사용합니다.

Bazel은 효율성을 위해 실행 중에 params 파일을 출력 트리에 쓰는 것을 생략할 수 있습니다. 작업을 디버깅 중이고 매개변수 파일을 검사하려면 --materialize_param_files를 빌드에 전달합니다.

매개변수

매개변수 설명
param_file_arg 필수
단일 '%s'를 포함하는 형식 문자열입니다. 인수가 매개변수 파일로 분산된 경우 매개변수 파일의 경로로 형식이 지정된 이 문자열로 구성된 인수로 대체됩니다.

예를 들어 인수가 params 파일 'params.txt'로 스필된 경우 '--file=%s'를 지정하면 작업 명령줄에 '--file=params.txt'가 포함됩니다.

use_always 기본값은 False입니다.
인수를 항상 매개변수 파일에 분산할지 여부입니다. false인 경우 bazel은 시스템 및 인수 길이를 기반으로 인수를 분산해야 하는지 여부를 결정합니다.