Skip to content

Buildozer Module

Transformations for creating, modifying, and deleting Bazel BUILD targets using Buildozer.

Runs Buildozer commands against one or more targets.

buildozer.modify(
target = "foo/bar:lib",
commands = [
buildozer.cmd("add deps :utils"),
buildozer.cmd("set visibility //..."),
],
)
ParameterTypeDescription
targetstring or list[string]Target expression(s) to modify
commandslist[string|cmd]Commands to apply
# Single target
target = "foo/bar:baz"
# All targets in a package
target = "foo/bar:all"
# Multiple targets
target = ["foo/bar:lib", "foo/bar:test"]
# Root BUILD file
target = ".:main"
buildozer.modify(
target = "foo/bar:baz",
commands = [
buildozer.cmd("set config \":foo\""),
],
)
buildozer.modify(
target = ["foo/bar:baz", "foo/bar:fooz"],
commands = [
buildozer.cmd("set config \":foo\""),
],
)

Creates a new BUILD target.

buildozer.create(
target = "pkg:new_lib",
rule_type = "java_library",
commands = [
"set srcs [\"Foo.java\", \"Bar.java\"]",
"add deps :utils",
],
)
ParameterTypeDescription
targetstringTarget to create (e.g., foo:bar)
rule_typestringRule type (e.g., java_library)
commandslistCommands to populate attributes
beforestringCreate before this target
afterstringCreate after this target

Control where the new target appears:

buildozer.create(
target = "pkg:new_test",
rule_type = "java_test",
after = "pkg:lib", # Place after existing lib target
commands = ["set srcs [\"Test.java\"]"],
)

This transformation reverses to delete the target.

Deletes a BUILD target.

buildozer.delete(target = "pkg:old_lib")
ParameterTypeDescription
targetstringTarget to delete
rule_typestringRule type (makes deletion reversible)
recreate_commandslistCommands to recreate (for reversal)
beforestringPosition hint for reversal
afterstringPosition hint for reversal

Provide rule_type to make the deletion reversible:

buildozer.delete(
target = "pkg:deprecated_lib",
rule_type = "java_library",
recreate_commands = [
"set srcs [\"Old.java\"]",
"add deps :legacy",
],
)

Creates a Buildozer command, optionally with a custom reversal.

buildozer.cmd(
forward = "add deps :new_dep",
reverse = "remove deps :new_dep",
)
ParameterTypeDescription
forwardstringThe command to run
reversestringOptional reverse command

These commands reverse automatically:

  • addremove
  • remove (element from list) ↔ add
  • replacereplace (swapped args)
# No reverse needed - auto-reverses
buildozer.cmd("add deps :foo")
# Custom reverse for non-reversible commands
buildozer.cmd(
forward = "set visibility //...",
reverse = "set visibility //pkg:__subpackages__",
)

Reads an attribute value from a target. Use in custom transformations.

def _check_deps(ctx):
deps = buildozer.print(
ctx = ctx,
attr = "deps",
target = "pkg:lib",
)
if ":banned_dep" in deps:
ctx.console.error("Found banned dependency!")
ParameterTypeDescription
ctxTransformWorkThe transformation context
attrstringAttribute to read
targetstringTarget to read from

Combines multiple Buildozer transformations into a single batch for efficiency.

buildozer.batch(
transforms = [
buildozer.modify(target = "a:lib", commands = ["add deps :x"]),
buildozer.modify(target = "b:lib", commands = ["add deps :y"]),
buildozer.create(target = "c:new", rule_type = "cc_library"),
],
)

Buildozer supports many commands. Here are the most useful:

CommandExampleDescription
addadd deps :fooAdd to list attribute
removeremove deps :barRemove from list
setset visibility ["//..."]Set attribute value
renamerename old_attr new_attrRename attribute
deletedelete testonlyRemove attribute
replacereplace deps :old :newReplace in list
movemove srcs hdrs *.hMove between lists

See the Buildozer documentation for the complete command reference.

Update imports when moving code between repositories:

transformations = [
buildozer.modify(
target = "//...:all",
commands = [
buildozer.cmd("replace deps @old_repo//lib @new_repo//lib"),
],
),
]

Enforce consistent settings across targets:

buildozer.modify(
target = ["//src/...:all"],
commands = [
"set testonly False",
"add tags [\"team:platform\"]",
],
)