--output flag details, please see the
reference manuals, Bazel query reference
and Bazel cquery reference. You can get help by
typing bazel help query or bazel help cquery on the
command line.
To execute a query while ignoring errors such as missing targets, use the
--keep_going flag.
Finding the dependencies of a rule
To see the dependencies of//foo, use the
deps function in bazel query:
//foo.
Tracing the dependency chain between two packages
The library//third_party/zlib:zlibonly isn’t in the BUILD file for
//foo, but it is an indirect dependency. How can
we trace this dependency path? There are two useful functions here:
allpaths and somepath. You may also want to exclude
tooling dependencies with --notool_deps if you care only about
what is included in the artifact you built, and not every possible job.
To visualize the graph of all dependencies, pipe the bazel query output through
the dot command-line tool:
dot supports other image formats, just replace svg with the
format identifier, for example, png.
When a dependency graph is big and complicated, it can be helpful start with a single path:
--output graph with allpaths,
you will get a flattened list of the dependency graph.
Aside: implicit dependencies
The BUILD file for//foo never references
//translations/tools:aggregator. So, where’s the direct dependency?
Certain rules include implicit dependencies on additional libraries or tools.
For example, to build a genproto rule, you need first to build the Protocol
Compiler, so every genproto rule carries an implicit dependency on the
protocol compiler. These dependencies are not mentioned in the build file,
but added in by the build tool. The full set of implicit dependencies is
currently undocumented. Using --noimplicit_deps allows you to filter out
these deps from your query results. For cquery, this will include resolved toolchains.
Reverse dependencies
You might want to know the set of targets that depends on some target. For instance, if you’re going to change some code, you might want to know what other code you’re about to break. You can userdeps(u, x) to find the reverse
dependencies of the targets in x within the transitive closure of u.
Bazel’s Sky Query
supports the allrdeps function which allows you to query reverse dependencies
in a universe you specify.
Miscellaneous uses
You can usebazel query to analyze many dependency relationships.
What exists …
What packages exist beneath foo?
What rules are defined in the foo package?
What files are generated by rules in the foo package?
What targets are generated by starlark macro foo?
What’s the set of BUILD files needed to build //foo?
What are the individual tests that a test_suite expands to?
Which of those are C++ tests?
Which of those are small? Medium? Large?
What are the tests beneath foo that match a pattern?
What package contains file path/to/file/bar.java?
What is the build label for path/to/file/bar.java?
What rule target(s) contain file path/to/file/bar.java as a source?
What package dependencies exist …
What packages does foo depend on? (What do I need to check out to build foo)
buildfiles is required in order to correctly obtain all files
referenced by subinclude; see the reference manual for details.
What packages does the foo tree depend on, excluding foo/contrib?
What rule dependencies exist …
What genproto rules does bar depend upon?
Find the definition of some JNI (C++) library that is transitively depended upon by a Java binary rule in the servlet tree.
What file dependencies exist …
What’s the complete set of Java source files required to build foo?
Source files:What is the complete set of Java source files required to build QUX’s tests?
Source files:What differences in dependencies between X and Y exist …
What targets does //foo depend on that //foo:foolib does not?
What C++ libraries do the foo tests depend on that the //foo production binary does not depend on?
Why does this dependency exist …
Why does bar depend on groups2?
bar. The query can then be further refined to:
Show me a path from docker/updater:updater_systest (a py_test) to some cc_library that it depends upon:
Why does library //photos/frontend:lib depend on two variants of the same library //third_party/jpeglib and //third_party/jpeg?
This query boils down to: “show me the subgraph of //photos/frontend:lib that
depends on both libraries”. When shown in topological order, the last element
of the result is the most likely culprit.
What depends on …
What rules under bar depend on Y?
X intersect allpaths(X, Y) is the general idiom for the query “which X
depend on Y?” If expression X is non-trivial, it may be convenient to bind a
name to it using let to avoid duplication.
What targets directly depend on T, in T’s package?
How do I break a dependency …
What dependency paths do I have to break to make bar no longer depend on X?
To output the graph to a svg file:
Misc
How many sequential steps are there in the //foo-tests build?
Unfortunately, the query language can’t currently give you the longest path
from x to y, but it can find the (or rather a) most distant node from the
starting point, or show you the lengths of the longest path from x to every
y that it depends on. Use maxrank: