작업에 전이 종속 항목에서 누적된 값이 포함된 큰 명령줄이 필요한 경우가 많습니다. 예를 들어 링커 명령줄에는 연결되는 모든 라이브러리에 필요한 모든 객체 파일이 나열될 수 있습니다. 이러한 전이적 데이터는 여러 타겟에서 공유할 수 있도록 depset에 저장하는 것이 좋습니다. 하지만 규칙 작성자가 작업 명령줄을 구성하기 위해 이러한 depsets를 문자열 목록으로 변환해야 한다면 이 메모리 공유 최적화는 무용지물이 됩니다.
이러한 이유로 작업 구성 함수는 문자열 외에도 Args 객체를 허용합니다. 각 Args 객체는 문자열과 depsets의 연결을 나타내며, 데이터를 조작하기 위한 변환은 선택사항입니다. Args 객체는 명령줄을 계산할 때인 실행 단계까지 캡슐화된 depsets를 처리하지 않습니다. 이렇게 하면 분석 단계가 완료될 때까지 비용이 많이 드는 복사를 연기할 수 있습니다. 자세한 내용은 성능 최적화 페이지를 참고하세요.
Args는 ctx.actions.args()를 호출하여 구성됩니다. ctx.actions.run() 또는 ctx.actions.run_shell()의 arguments 매개변수로 전달할 수 있습니다. Args 객체의 각 변형은 최종 명령줄에 값을 추가합니다.
map_each 기능을 사용하면 항목이 문자열로 변환되는 방식을 맞춤설정할 수 있습니다. map_each 함수를 제공하지 않으면 표준 변환은 다음과 같습니다.
- 이미 문자열인 값은 그대로 유지됩니다.
File객체는File.path값으로 변환됩니다.Label객체는 기본 저장소의 컨텍스트에서 해결될 때 동일한 객체로 다시 해결되는 문자열 표현으로 변환됩니다. 가능한 경우 문자열 표현은 저장소의 표준 이름 대신 저장소의 명시적 이름을 사용하므로 이 표현은 BUILD 파일에서 사용하기에 적합합니다. 표현의 정확한 형태는 보장되지 않지만 일반적인 예는//foo:bar,@repo//foo:bar,@@canonical_name+//foo:bar.bzl입니다.- 다른 모든 유형은 지정되지 않은 방식으로 문자열로 변환됩니다. 이러한 이유로 문자열 또는
File유형이 아닌 값을add()에 전달하면 안 되며,add_all()또는add_joined()에 전달하는 경우map_each함수를 제공해야 합니다.
문자열 형식 지정 (add*() 메서드의 format, format_each, format_joined 매개변수)을 사용하는 경우 형식 템플릿은 문자열의 %-대체와 동일한 방식으로 해석됩니다. 단, 템플릿에는 대체 자리표시자가 정확히 하나 있어야 하며 %s여야 합니다. 리터럴 퍼센트는 %%로 이스케이프 처리할 수 있습니다. 서식은 위와 같이 값이 문자열로 변환된 후에 적용됩니다.
각 add*() 메서드에는 나머지 인수 앞에 삽입할 추가 위치 매개변수, 즉 'arg name' 문자열을 허용하는 대체 형식이 있습니다. add_all 및 add_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
|
required 위치 매개변수가 두 개 전달되면 arg 이름으로 해석됩니다. 인수 이름은 처리 없이 값 앞에 추가됩니다. 하나의 위치 매개변수만 전달되면 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)
대부분의 처리는 다음 단계에 따라 추가할 인수 목록에서 발생합니다.
- 각 디렉터리
File항목은 해당 디렉터리에 재귀적으로 포함된 모든File로 대체됩니다. map_each가 제공되면 각 항목에 적용되고 결과 문자열 목록이 연결되어 초기 인수 목록을 형성합니다. 그렇지 않으면 초기 인수 목록은 각 항목에 표준 변환을 적용한 결과입니다.- 목록의 각 인수는 있는 경우
format_each로 형식이 지정됩니다. uniquify가 true이면 중복 인수가 삭제됩니다. 첫 번째 발생이 유지됩니다.before_each문자열이 제공되면 목록의 각 기존 인수 앞에 새 인수로 삽입됩니다. 이렇게 하면 이 시점까지 추가되는 인수의 수가 효과적으로 두 배가 됩니다.- 목록이 비어 있고
omit_if_empty이 true (기본값)인 경우를 제외하고, arg 이름과terminate_with은 제공된 경우 각각 첫 번째 인수와 마지막 인수로 삽입됩니다.
매개변수
| 매개변수 | 설명 |
|---|---|
arg_name_or_values
|
required 위치 매개변수가 두 개 전달되면 arg 이름으로 해석됩니다. arg 이름은 처리 없이 별도의 인수로 values 앞에 추가됩니다. omit_if_empty가 true (기본값)이고 다른 항목이 추가되지 않으면 이 arg 이름이 추가되지 않습니다 (values이 비어 있거나 모든 항목이 필터링된 경우와 같음). 하나의 위치 매개변수만 전달되면 values로 해석됩니다 (아래 참고).
|
values
|
sequence 또는 depset
기본값은 unbound입니다. 항목이 추가될 목록, 튜플 또는 depset입니다. |
map_each
|
호출 가능 또는 None;
기본값은 None각 항목을 0개 이상의 문자열로 변환하는 함수로, 추가되기 전에 추가로 처리될 수 있습니다. 이 매개변수를 제공하지 않으면 표준 전환이 사용됩니다. 이 함수에는 변환할 항목과 선택적 반환 값의 유형은 항목에 대해 생성할 인수 수에 따라 달라집니다.
None을 반환하는 것은 각각 길이가 1 또는 0인 목록을 반환하는 것과 동일한 효과가 있습니다. 하지만 필요하지 않은 목록을 만들지 않는 것이 더 효율적이고 가독성이 좋습니다.일반적으로 디렉터리인 항목은 실행 단계에서 의도치 않게 대규모 분석 단계 데이터 구조가 유지되지 않도록 하려면 경고: |
format_each
|
string 또는 None;
기본값은 None입니다. map_each 함수에서 반환된 각 문자열에 적용되는 선택적 형식 문자열 패턴입니다. 형식 문자열에는 '%s' 자리표시자가 하나만 있어야 합니다.
|
before_each
|
string 또는 None;
기본값은 None입니다. values에서 파생된 각 인수 앞에 추가할 선택적 인수입니다.
|
omit_if_empty
|
bool;
default is TrueIf true, if there are no arguments derived from values to be appended, then all further processing is suppressed and the command line will be unchanged. false인 경우 다른 인수가 있는지 여부와 관계없이 인수의 이름과 terminate_with이 제공된 경우 terminate_with이 추가됩니다.
|
uniquify
|
bool;
default is FalseIf true, duplicate arguments that are derived from values will be omitted. 각 인수의 첫 번째 항목만 유지됩니다. 일반적으로 이 기능은 depsets에서 이미 중복을 생략하므로 필요하지 않지만 map_each가 여러 항목에 대해 동일한 문자열을 내보내는 경우 유용할 수 있습니다.
|
expand_directories
|
bool;
default is TrueIf true, any directories in values will be expanded to a flat list of files. 이는 map_each가 적용되기 전에 발생합니다.
|
terminate_with
|
string 또는 None;
기본값은 None입니다. 다른 모든 인수 뒤에 추가할 선택적 인수입니다. omit_if_empty이 true (기본값)이고 다른 항목이 추가되지 않으면 (values이 비어 있거나 모든 항목이 필터링된 경우) 이 인수가 추가되지 않습니다.
|
allow_closure
|
bool;
default is Falsetrue인 경우 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
|
required 위치 매개변수가 두 개 전달되면 arg 이름으로 해석됩니다. arg 이름은 처리 없이 values 앞에 추가됩니다. omit_if_empty이 true (기본값)이고 values에서 파생되어 결합할 문자열이 없는 경우 (values이 비어 있거나 모든 항목이 필터링된 경우 발생할 수 있음) 이 인수는 추가되지 않습니다. 하나의 위치 매개변수만 전달되면 values로 해석됩니다 (아래 참고).
|
values
|
시퀀스 또는 depset
기본값은 unbound입니다. 항목이 결합될 목록, 튜플 또는 depset입니다. |
join_with
|
string;
requiredmap_each 및 format_each을 적용하여 가져온 문자열을 string.join()과 동일한 방식으로 결합하는 데 사용되는 구분 기호 문자열입니다.
|
map_each
|
호출 가능 또는 None;
기본값은 None입니다. add_all과 동일합니다.
|
format_each
|
문자열 또는 None;
기본값은 None입니다. add_all과 동일합니다.
|
format_joined
|
string 또는 None;
기본값은 None입니다. 연결된 문자열에 적용되는 선택적 형식 문자열 패턴입니다. 형식 문자열에는 '%s' 자리표시자가 하나만 있어야 합니다. |
omit_if_empty
|
bool;
default is Truetrue인 경우 연결할 문자열이 없으면 ( values이 비어 있거나 모든 항목이 필터링되었기 때문) 모든 후속 처리가 억제되고 명령줄이 변경되지 않습니다. false인 경우 함께 조인할 문자열이 없더라도 인수 이름과 빈 문자열 (0개 문자열의 논리적 조인)이라는 두 인수가 추가됩니다.
|
uniquify
|
bool;
default is Falseadd_all과 동일합니다.
|
expand_directories
|
bool;
default is Trueadd_all과 동일합니다.
|
allow_closure
|
bool;
default is Falseadd_all과 동일합니다.
|
set_param_file_format
Args Args.set_param_file_format(format)
매개변수
| 매개변수 | 설명 |
|---|---|
format
|
string;
required 다음 중 하나여야 합니다.
호출되지 않으면 형식은 기본적으로 'shell'입니다. |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)
Bazel은 효율성을 위해 실행 중에 출력 트리에 매개변수 파일을 쓰는 것을 생략할 수 있습니다. 작업을 디버깅하고 매개변수 파일을 검사하려면 빌드에 --materialize_param_files를 전달하세요.
매개변수
| 매개변수 | 설명 |
|---|---|
param_file_arg
|
string;
required '%s'가 하나 있는 형식 문자열입니다. 인수가 params 파일로 유출되면 params 파일의 경로로 형식이 지정된 이 문자열로 구성된 인수로 대체됩니다. 예를 들어 인수가 'params.txt'라는 params 파일에 유출된 경우 '--file=%s'를 지정하면 작업 명령줄에 '--file=params.txt'가 포함됩니다. |
use_always
|
bool;
default is False항상 params 파일에 인수를 스필할지 여부입니다. false인 경우 Bazel은 시스템 및 arg 길이에 따라 인수를 스필해야 하는지 결정합니다. |