aquery
명령어를 사용하면 빌드 그래프에서 작업을 쿼리할 수 있습니다.
분석 후 구성된 타겟 그래프에서 작동하고
작업, 아티팩트 및 그 관계에 대한 정보가 포함되어 있습니다.
aquery
는 작업/아티팩트의 속성에 관심이 있을 때 유용합니다.
생성된 타겟 그래프에서 생성됩니다. 예를 들어, 실제 명령어는
알 수 있습니다.
이 도구는 여러 명령줄 옵션을 허용합니다. 특히 aquery 명령어는 일반 Bazel 빌드 위에서 실행되며 옵션 집합으로 간주됩니다.
이는 기존 모델에서도 사용할 수 있는 동일한 함수 집합을 지원합니다.
query
, siblings
, buildfiles
및
tests
입니다.
aquery
출력 예 (구체적인 세부정보 없음):
$ bazel aquery 'deps(//some:label)' action 'Writing file some_file_name' Mnemonic: ... Target: ... Configuration: ... ActionKey: ... Inputs: [...] Outputs: [...]
기본 구문
aquery
문법의 간단한 예는 다음과 같습니다.
bazel aquery "aquery_function(function(//target))"
쿼리 표현식 (따옴표로 묶음)은 다음과 같이 구성됩니다.
aquery_function(...)
:aquery
와 관련된 함수입니다. 자세한 내용은 아래를 참조하세요.function(...)
: 표준 함수 를 기존query
로 설정합니다.//target
는 관심 타겟의 라벨입니다.
# aquery examples: # Get the action graph generated while building //src/target_a $ bazel aquery '//src/target_a' # Get the action graph generated while building all dependencies of //src/target_a $ bazel aquery 'deps(//src/target_a)' # Get the action graph generated while building all dependencies of //src/target_a # whose inputs filenames match the regex ".*cpp". $ bazel aquery 'inputs(".*cpp", deps(//src/target_a))'
쿼리 함수 사용
다음과 같은 세 가지 aquery
함수가 있습니다.
inputs
: 입력별로 작업을 필터링합니다.outputs
: 출력별로 작업 필터링mnemonic
: 니모닉을 기준으로 작업 필터링
expr ::= inputs(word, expr)
inputs
연산자는 expr
빌드에서 생성된 작업을 반환합니다.
입력 파일 이름이 word
에서 제공한 정규식과 일치하는
$ bazel aquery 'inputs(".*cpp", deps(//src/target_a))'
outputs
및 mnemonic
함수는 비슷한 구문을 공유합니다.
함수를 결합하여 AND 연산을 수행할 수도 있습니다. 예를 들면 다음과 같습니다.
$ bazel aquery 'mnemonic("Cpp.*", (inputs(".*cpp", inputs("foo.*", //src/target_a))))'
위 명령어는 //src/target_a
빌드와 관련된 모든 작업을 찾습니다.
니모닉이 "Cpp.*"
와 일치하고 입력이 패턴과 일치하는 항목
".*cpp"
및 "foo.*"
.
생성된 구문 오류의 예는 다음과 같습니다.
$ bazel aquery 'deps(inputs(".*cpp", //src/target_a))' ERROR: aquery filter functions (inputs, outputs, mnemonic) produce actions, and therefore can't be the input of other function types: deps deps(inputs(".*cpp", //src/target_a))
옵션
빌드 옵션
aquery
는 일반 Bazel 빌드 위에서 실행되므로
옵션
사용할 수 있습니다
Aquery 옵션
--output=(text|summary|proto|jsonproto|textproto), default=text
기본 출력 형식 (text
)은 사람이 읽을 수 있습니다.
컴퓨터가 읽을 수 있는 형식으로 proto
, textproto
또는 jsonproto
를 사용합니다.
proto 메시지는 analysis.ActionGraphContainer
입니다.
--include_commandline, default=true
출력에 작업 명령줄의 콘텐츠가 포함됩니다 (큰 가능성이 있음).
--include_artifacts, default=true
출력에 표시되는 작업 입력 및 출력의 이름 (크기가 클 수 있음)을 포함합니다.
--include_aspects, default=true
Aspect에서 생성된 작업을 출력에 포함할지 여부입니다.
--include_param_files, default=false
명령어에 사용된 매개변수 파일의 콘텐츠 (크기가 클 수 있음)를 포함합니다.
--include_file_write_contents, default=false
actions.write()
작업의 파일 콘텐츠와
SourceSymlinkManifest
작업의 매니페스트 파일입니다. 파일 콘텐츠는 다음과 같습니다.
--output=
xxxproto
와 함께 file_contents
필드에 반환됩니다.
--output=text
를 사용하면 출력은 다음과 같습니다.
FileWriteContents: [<base64-encoded file contents>]
선
--skyframe_state, default=false
추가 분석을 수행하지 않고 Skyframe에서 작업 그래프를 덤프합니다.
기타 도구 및 기능
스카이프레임 상태에 대한 쿼리
스카이프레임은 성과 증분 모델을 살펴보겠습니다 Bazel 서버의 각 인스턴스에서 Skyframe은 종속 항목 그래프를 저장함 분석 단계의 이전 실행에서 구성된 데이터 세트입니다
경우에 따라 Skyframe에서 작업 그래프를 쿼리하는 것이 유용합니다. 사용 사례 예시는 다음과 같습니다.
bazel build //target_a
실행bazel build //target_b
실행foo.out
파일이 생성되었습니다.
Bazel 사용자로서 foo.out
가 빌드에서 생성되었는지 확인하고 싶습니다.
//target_a
또는 //target_b
하나는 bazel aquery 'outputs("foo.out", //target_a)'
를 실행하고
bazel aquery 'outputs("foo.out", //target_b)'
:
를 사용하여 foo.out
를 만들고 결과적으로 타겟을 생성합니다. 그러나 다양한
이전에 빌드된 타겟이 2개보다 클 수 있어 여러 개의 aquery
를 실행해야 합니다.
번거로운 작업이죠
또는 --skyframe_state
플래그를 사용할 수 있습니다.
# List all actions on Skyframe's action graph $ bazel aquery --output=proto --skyframe_state # or # List all actions on Skyframe's action graph, whose output matches "foo.out" $ bazel aquery --output=proto --skyframe_state 'outputs("foo.out")'
--skyframe_state
모드를 사용하면 aquery
는 작업 그래프의 콘텐츠를 가져옵니다.
Skyframe이 Bazel 인스턴스를 유지하고 필요에 따라 필터링을 수행하고
분석 단계를 재실행하지 않고 콘텐츠를 출력합니다.
특별 고려사항
출력 형식
--skyframe_state
은(는) 현재 --output=proto
에서만 사용할 수 있습니다.
및 --output=textproto
쿼리 표현식에 대상 라벨이 포함되지 않음
현재 --skyframe_state
는 스카이프레임에 있는 전체 작업 그래프를 쿼리합니다.
배포될 수 있습니다 쿼리에 지정된 타겟 라벨과
--skyframe_state
는 구문 오류로 간주됩니다.
# WRONG: Target Included $ bazel aquery --output=proto --skyframe_state **//target_a** ERROR: Error while parsing '//target_a)': Specifying build target(s) [//target_a] with --skyframe_state is currently not supported. # WRONG: Target Included $ bazel aquery --output=proto --skyframe_state 'inputs(".*.java", **//target_a**)' ERROR: Error while parsing '//target_a)': Specifying build target(s) [//target_a] with --skyframe_state is currently not supported. # CORRECT: Without Target $ bazel aquery --output=proto --skyframe_state $ bazel aquery --output=proto --skyframe_state 'inputs(".*.java")'
쿼리 출력 비교
aquery_differ
도구를 사용하여 서로 다른 두 aquery 호출의 출력을 비교할 수 있습니다.
예를 들어 규칙 정의를 변경한 후
실행 중인 명령줄이 변경되지 않았습니다 aquery_differ
가 이를 위한 도구입니다.
이 도구는 bazelbuild/bazel 저장소에서 사용할 수 있습니다. 사용하려면 저장소를 로컬 머신에 클론하세요. 사용 예는 다음과 같습니다.
$ bazel run //tools/aquery_differ -- \ --before=/path/to/before.proto \ --after=/path/to/after.proto \ --input_type=proto \ --attrs=cmdline \ --attrs=inputs
위의 명령어는 before
및 after
aquery 출력의 차이를 반환합니다.
한 액션에는 있고 다른 액션에는 없는 액션,
각 쿼리 출력의 명령줄/입력 등). 위 명령어를 실행한 결과는 다음과 같습니다.
Aquery output 'after' change contains an action that generates the following outputs that aquery output 'before' change doesn't: ... /list of output files/ ... [cmdline] Difference in the action that generates the following output(s): /path/to/abc.out --- /path/to/before.proto +++ /path/to/after.proto @@ -1,3 +1,3 @@ ... /cmdline diff, in unified diff format/ ...
명령어 옵션
--before, --after
: 비교할 aquery 출력 파일입니다.
--input_type=(proto|text_proto), default=proto
: 입력 형식
할 수 있습니다. proto
및 textproto
쿼리 출력이 지원됩니다.
--attrs=(cmdline|inputs), default=cmdline
: 작업 속성
있습니다.
가로세로 비율
평가 항목은 겹쳐서 적용될 수 있습니다. 다음에 의해 생성된 작업의 aquery 출력은 이러한 관점에는 평가 항목 경로가 포함됩니다. 작업을 생성한 대상에 적용되는 관점입니다.
관점에 따른 관점의 예시:
t0 ^ | <- a1 t1 ^ | <- a2 t2
ti를 규칙 ri의 대상이 되도록 하여 관점 ai를 적용합니다. 할 수 있습니다
타겟 t0에 적용할 때 a2가 액션 X를 생성한다고 가정합니다. 텍스트 출력은
액션 X의 bazel aquery --include_aspects 'deps(//t2)'
는 다음과 같습니다.
action ... Mnemonic: ... Target: //my_pkg:t0 Configuration: ... AspectDescriptors: [//my_pkg:rule.bzl%**a2**(foo=...) -> //my_pkg:rule.bzl%**a1**(bar=...)] ...
이는 관점 a2
에 의해 X
작업이 다음에 적용되었음을 의미합니다.
a1(t0)
, 여기서 a1(t0)
은 관점 a1
의 결과입니다.
타겟 t0
에 진입
각 AspectDescriptor
의 형식은 다음과 같습니다.
AspectClass([param=value,...])
AspectClass
는 Aspect 클래스의 이름 (네이티브 관점의 경우) 또는
bzl_file%aspect_name
(Starlark Aspects용). AspectDescriptor
:
정렬한 후
종속 항목 그래프.
JSON 프로필과 연결
쿼리는 빌드에서 실행되는 작업 (실행되는 이유, 입력/출력), JSON 프로필 실행 시기와 기간을 알려줍니다. 작업의 기본 출력인 공통분모를 통해 이 두 가지 정보를 결합할 수 있습니다.
액션 포함 JSON 프로필에 출력하려면
--experimental_include_primary_output --noslim_profile
슬림한 프로필은 기본 출력을 포함하는 것과 호환되지 않습니다. 작업의 기본 출력
기본적으로 aquery에 포함됩니다.
현재 이 2가지 데이터 소스를 결합할 수 있는 표준 도구는 제공되지 않지만 위의 정보를 사용하여 자체 스크립트를 작성할 수 있습니다.
알려진 문제
공유된 작업 처리
때로는 작업이 공유 다르기 때문입니다
실행 단계에서 이러한 공유된 작업은
단순히 하나로 간주되고 한 번만 실행됩니다.
하지만 쿼리는 실행 전 및 분석 후 작업 그래프에서 작동하므로
출력 아티팩트의 execPath
가 정확히 동일한 개별 작업 등입니다. 그 결과
상응하는 아티팩트가 중복된 것으로 보입니다.
쿼리 문제/계획된 기능 목록은 GitHub
FAQ
ActionKey는 입력 파일의 콘텐츠가 변경되더라도 동일하게 유지됩니다.
쿼리의 컨텍스트에서 ActionKey
은 String
ActionAnalysisMetadata#getKey:
Returns a string encoding all of the significant behaviour of this Action that might affect the output. The general contract of `getKey` is this: if the work to be performed by the execution of this action changes, the key must change. ... Examples of changes that should affect the key are: - Changes to the BUILD file that materially affect the rule which gave rise to this Action. - Changes to the command-line options, environment, or other global configuration resources which affect the behaviour of this kind of Action (other than changes to the names of the input/output files, which are handled externally). - An upgrade to the build tools which changes the program logic of this kind of Action (typically this is achieved by incorporating a UUID into the key, which is changed each time the program logic of this action changes). Note the following exception: for actions that discover inputs, the key must change if any input names change or else action validation may falsely validate.
이렇게 하면 입력 파일의 콘텐츠에 대한 변경사항이 제외되며, RemoteCacheClient#ActionKey를 사용합니다.
업데이트
문제 또는 기능 요청은 여기에서 문제를 제기해 주세요.