Bazel rules for basic file operations, such as creating directories and formatting.
Create a directory from files:
load("@rules_file//file:rules.bzl", "directory")
directory(
name = "example",
srcs = glob(["**/*.txt"]),
)Create a directory from a tarball:
load("@rules_file//file:rules.bzl", "untar")
untar(
name = "example",
src = "example.tar",
)Access files without regard to package structure. This can be helpful for formatting or Bazel integration tests.
Create a new repository containing all workspace files.
WORKSPACE.bazel
files(
name = "files"
build = "BUILD.file.bazel",
root_file = "//:WORKSPACE.bazel",
)BAZEL.bazel
load("@rules_file//file:rules.bzl", "bazelrc_deleted_packages")
bazelrc_deleted_packages(
name = "bazelrc",
output = "deleted_packages.bazelrc",
packages = ["@files//:packages"],
)
files.bazel
# note: files is the symlink to the workspace
filegroup(
name = "example",
srcs = glob(["files/**/*.txt"]),
visibility = ["//visibility:public"],
)Generate deleted_packages.bazelrc:
bazel run :bazelrc
(To check if this is up-to-date, run bazel run :bazelrc.diff.)
.bazelrc
import %workspace%/deleted.bazelrc
Now @files//:example is all *.txt files in the workspace.
Use files in the test directory as data for a Bazel integration test.
BAZEL.bazel
load("@rules_file//file:rules.bzl", "bazelrc_deleted_packages", "find_packages")
filegroup(
name = "test",
srcs = glob(["test/**/*.bazel" "test/**/*.txt"]),
)
find_packages(
name = "test_packages",
roots = ["test"],
)
bazelrc_deleted_packages(
name = "bazelrc",
output = "deleted_packages.bazelrc",
packages = [":test_packages"],
)
Generate deleted_packages.bazelrc by running:
bazel run :bazelrc
.bazelrc
import %workspace%/deleted_packages.bazelrc
In some cases, it is necessary to version control build products in the workspace (bootstrapping, working with other tools).
These rules build the outputs, and copy them to the workspace or check for differences.
BUILD.bazel
load("@rules_file//file:rules.bzl", "bazelrc_deleted_packages")
load("@rules_file//file:rules.bzl", "generate", "generate_test")
genrule(
name = "example",
cmd = "echo GENERATED! > $@",
outs = ["out/example.txt"],
)
generate(
name = "example_gen",
srcs = "example.txt",
data = ["out/example.txt"],
data_strip_prefix = "out",
)
generate_test(
name = "example_diff",
generate = ":example_gen",
)
bazelrc_deleted_packages(
name = "gen_bazelrc",
output = "deleted.bazelrc",
packages = ["@files//:packages"],
)To overwrite the workspace file:
bazel run :example_genTo check for differences (e.g. in CI):
bazel test :example_diffFormatting is a particular case of the checked-in build products pattern.
The code formatting is a regular Bazel action. The formatted result can be using to overwrite workspace files, or to check for differences.
This repository has rules for buildifier, black, and gofmt. It is also used for prettier.
WORKSPACE.bazel
BUILDTOOLS_VERSION = "3.5.0"
http_archive(
name = "com_github_bazelbuild_buildtools",
sha256 = "f5b666935a827bc2b6e2ca86ea56c796d47f2821c2ff30452d270e51c2a49708",
strip_prefix = "buildtools-%s" % BUILDTOOLS_VERSION,
url = "https://github.com/bazelbuild/buildtools/archive/%s.zip" % BUILDTOOLS_VERSION,
)
load("@com_github_bazelbuild_buildtools//buildifier:deps.bzl", "buildifier_dependencies")
buildifier_dependencies()
files(
name = "files"
build = "BUILD.file.bazel",
root_file = "//:WORKSPACE.bazel",
)BUILD.bazel
load("@rules_file//buildifier:rules.bzl", "buildifier")
load("@rules_file//generate:rules.bzl", "format", "generate_test")
buildifier(
name = "buildifier",
)
format(
name = "buildifier_format",
srcs = ["@files//:buildifier_files"],
formatter = ":buildifier",
strip_prefix = "files",
)
generate_test(
name = "buildifier_diff",
generate = ":format",
)files.bazel
filegroup(
name = "buildifier_files",
srcs = glob(
[
"files/**/*.bazel",
"files/**/*.bzl",
"files/**/BUILD",
"files/**/WORKSPACE",
],
),
visibility = ["//visibility:public"],
)Generate deleted_packages.bazelrc:
bazel run :gen_bazelrc
.bazelrc
import %workspace%/deleted_packages.bazelrc
To format:
bazel run :buildifier_formatTo check format:
bazel run :buildifier_diff