En esta página, se explica cómo comenzar a usar el lenguaje de consulta de Bazel para hacer un seguimiento dependencias en tu código.
Para obtener información sobre el idioma y los detalles de la marca --output
, consulta la
manuales de referencia, referencia de consultas de Bazel
y Referencia de cquery de Bazel. Para obtener ayuda,
escribiendo bazel help query
o bazel help cquery
en el
la línea de comandos.
Para ejecutar una consulta mientras se ignoran errores como objetivos faltantes, usa el
--keep_going
.
Encuentra las dependencias de una regla
Para ver las dependencias de //foo
, usa el comando
Función deps
en la consulta de Bazel:
$ bazel query "deps(//foo)" //foo:foo //foo:foo-dep ...
Este es el conjunto de todos los destinos necesarios para compilar //foo
.
Cómo hacer un seguimiento de la cadena de dependencias entre dos paquetes
La biblioteca //third_party/zlib:zlibonly
no se encuentra en el archivo Build de
//foo
, pero es una dependencia indirecta. ¿Cómo puedo
trazamos esta ruta de dependencia? Aquí hay dos funciones útiles:
allpaths
y somepath
. También puedes excluir
dependencias de herramientas con --notool_deps
si solo te interesan
lo que incluye el artefacto que compilaste, y no todos los trabajos posibles.
Para visualizar el gráfico de todas las dependencias, canaliza el resultado de la consulta de Bazel mediante
la herramienta de línea de comandos de dot
:
$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg
Cuando un gráfico de dependencias es grande y complicado, puede ser útil comenzar con una sola ruta de acceso:
$ bazel query "somepath(//foo:foo, third_party/zlib:zlibonly)" //foo:foo //translations/tools:translator //translations/base:base //third_party/py/MySQL:MySQL //third_party/py/MySQL:_MySQL.so //third_party/mysql:mysql //third_party/zlib:zlibonly
Si no especificas --output graph
con allpaths
,
obtendrás una lista plana del gráfico de dependencias.
$ bazel query "allpaths(//foo, third_party/...)" ...many errors detected in BUILD files... //foo:foo //translations/tools:translator //translations/tools:aggregator //translations/base:base //tools/pkg:pex //tools/pkg:pex_phase_one //tools/pkg:pex_lib //third_party/python:python_lib //translations/tools:messages //third_party/py/xml:xml //third_party/py/xml:utils/boolean.so //third_party/py/xml:parsers/sgmlop.so //third_party/py/xml:parsers/pyexpat.so //third_party/py/MySQL:MySQL //third_party/py/MySQL:_MySQL.so //third_party/mysql:mysql //third_party/openssl:openssl //third_party/zlib:zlibonly //third_party/zlib:zlibonly_v1_2_3 //third_party/python:headers //third_party/openssl:crypto
Apartado: dependencias implícitas
El archivo Build de //foo
nunca hace referencia.
//translations/tools:aggregator
Entonces, ¿dónde está la dependencia directa?
Algunas reglas incluyen dependencias implícitas en bibliotecas o herramientas adicionales.
Por ejemplo, para compilar una regla genproto
, primero debes compilar el protocolo
Compilador, por lo que cada regla genproto
tiene una dependencia implícita en el
de protocolo estándar. Estas dependencias no se mencionan en el archivo de compilación,
pero lo agrega la herramienta de compilación. El conjunto completo de dependencias implícitas
actualmente sin documentar. Usar --noimplicit_deps
te permite filtrar
estas dependencias a partir de los resultados de tu consulta. Para cquery, esto incluirá cadenas de herramientas resueltas.
Revertir dependencias
Es posible que quieras conocer el conjunto de objetivos que depende de algún objetivo. Por ejemplo:
Si piensas cambiar algún código, debes saber qué otro código
estás a punto de romperse. Puedes usar rdeps(u, x)
para encontrar la inversa
las dependencias de los objetivos en x
dentro del cierre transitivo de u
.
Sky Query de Bazel
Admite la función allrdeps
, que te permite consultar dependencias inversas.
en el universo que especifiques.
Usos varios
Puedes usar bazel query
para analizar muchas relaciones de dependencia.
¿Qué existe ...?
¿Qué paquetes existen debajo de foo
?
bazel query 'foo/...' --output package
¿Qué reglas se definen en el paquete foo
?
bazel query 'kind(rule, foo:*)' --output label_kind
¿Qué archivos se generan con las reglas del paquete foo
?
bazel query 'kind("generated file", //foo:*)'
¿Qué objetivos genera la macro Starlark foo
?
bazel query 'attr(generator_function, foo, //path/to/search/...)'
¿Cuál es el conjunto de archivos BUILD necesario para compilar //foo
?
bazel query 'buildfiles(deps(//foo))' | cut -f1 -d:
¿Cuáles son las pruebas individuales a las que se expande un test_suite
?
bazel query 'tests(//foo:smoke_tests)'
¿Cuáles de estas son pruebas de C++?
bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'
¿Cuáles son pequeños? ¿Medio? ¿Grande?
bazel query 'attr(size, small, tests(//foo:smoke_tests))' bazel query 'attr(size, medium, tests(//foo:smoke_tests))' bazel query 'attr(size, large, tests(//foo:smoke_tests))'
¿Cuáles son las pruebas inferiores a foo
que coinciden con un patrón?
bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'
El patrón es una regex y se aplica al nombre completo de la regla. Es similar a hacer
bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'
¿Qué paquete contiene el archivo path/to/file/bar.java
?
bazel query path/to/file/bar.java --output=package
¿Cuál es la etiqueta de compilación de path/to/file/bar.java?
?
bazel query path/to/file/bar.java
¿Qué destinos de la regla contienen el archivo path/to/file/bar.java
como fuente?
fullname=$(bazel query path/to/file/bar.java) bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"
Qué dependencias de paquetes existen ...
¿De qué paquetes depende foo
? (¿Qué debo verificar para compilar foo
)
bazel query 'buildfiles(deps(//foo:foo))' --output package
¿De qué paquetes depende el árbol de foo
, excepto foo/contrib
?
bazel query 'deps(foo/... except foo/contrib/...)' --output package
Qué dependencias de reglas existen ...
¿De qué reglas de genproto depende la barra?
bazel query 'kind(genproto, deps(bar/...))'
Encuentra la definición de alguna biblioteca JNI (C++) de la que se depende transitivamente una regla binaria de Java en el árbol de servlet.
bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...Ahora encontrarás las definiciones de todos los objetos binarios de Java que dependen de ellos
bazel query 'let jbs = kind(java_binary, //java/com/example/frontend/...) in let cls = kind(cc_.*library, deps($jbs)) in $jbs intersect allpaths($jbs, $cls)'
Qué dependencias de archivos existen ...
¿Cuál es el conjunto completo de archivos fuente de Java necesario para compilar foo?
Archivos de origen:
bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$
Archivos generados:
bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$
¿Cuál es el conjunto completo de archivos de origen de Java necesario para compilar las pruebas de QUX?
Archivos de origen:
bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
Archivos generados:
bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
¿Qué diferencias de dependencias entre X e Y existen?
¿De qué objetivos depende //foo
de que //foo:foolib
no?
bazel query 'deps(//foo) except deps(//foo:foolib)'
¿De qué bibliotecas C++ dependen las pruebas foo
del objeto binario de producción //foo
no depende?
bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'
¿Por qué existe esta dependencia ...?
¿Por qué bar
depende de groups2
?
bazel query 'somepath(bar/...,groups2/...:*)'
Una vez que tengas los resultados de esta consulta, a menudo encontrarás que un solo
objetivo se destaca por ser una acción inesperada o flagrante e indeseable
dependencia de bar
. La consulta se puede definir mejor para lo siguiente:
Mostrarme una ruta de docker/updater:updater_systest
(un py_test
) a alguna cc_library
de la que depende:
bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in somepath(docker/updater:updater_systest, $cc)'
¿Por qué la biblioteca //photos/frontend:lib
depende de dos variantes de la misma biblioteca //third_party/jpeglib
y //third_party/jpeg
?
Esta consulta se resume a lo siguiente: “muéstrame el subgrafo de //photos/frontend:lib
que
depende de ambas bibliotecas". Cuando se muestra en orden topológico, el último elemento
de que el resultado sea
el culpable más probable.
bazel query 'allpaths(//photos/frontend:lib, //third_party/jpeglib) intersect allpaths(//photos/frontend:lib, //third_party/jpeg)' //photos/frontend:lib //photos/frontend:lib_impl //photos/frontend:lib_dispatcher //photos/frontend:icons //photos/frontend/modules/gadgets:gadget_icon //photos/thumbnailer:thumbnail_lib //third_party/jpeg/img:renderer
Qué depende de ...
¿Qué reglas debajo de la barra dependen de Y?
bazel query 'bar/... intersect allpaths(bar/..., Y)'
¿Qué objetivos dependen directamente de T, en el paquete de T?
bazel query 'same_pkg_direct_rdeps(T)'
Cómo romper una dependencia ...
¿Qué rutas de dependencia debo interrumpir para que bar
ya no dependa de X?
Para obtener el resultado del gráfico en un archivo svg
, haz lo siguiente:
bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg
Varios
¿Cuántos pasos secuenciales hay en la compilación de //foo-tests
?
Lamentablemente, el lenguaje de consulta no puede proporcionarte la ruta de acceso más larga en este momento
de x a y, pero puede encontrar (o más bien a) el nodo más distante del
punto de partida o las longitudes de la ruta más larga desde x hasta cada
y del que depende. Usa maxrank
:
bazel query 'deps(//foo-tests)' --output maxrank | tail -1 85 //third_party/zlib:zutil.c
El resultado indica que existen rutas de longitud 85 que deben aparecer en orden en esta compilación.