These are build rules for working with Jsonnet files with Bazel.
To use the Jsonnet rules, add the following to your WORKSPACE file to add the external repositories for Jsonnet:
load("@bazel_tools//tools/build_defs/jsonnet:jsonnet.bzl", "jsonnet_repositories") jsonnet_repositories()
jsonnet_library(name, srcs, deps, imports)
Suppose you have the following directory structure:
[workspace]/
WORKSPACE
configs/
BUILD
backend.jsonnet
frontend.jsonnet
You can use the jsonnet_library rule to build a collection of .jsonnet files that can be imported by other .jsonnet files as dependencies:
configs/BUILD:
load("@bazel_tools//tools/build_defs/jsonnet:jsonnet.bzl", "jsonnet_library") jsonnet_library( name = "configs", srcs = [ "backend.jsonnet", "frontend.jsonnet", ], )
jsonnet_to_json(name, src, deps, outs, multiple_outputs, imports, vars, code_vars)
{ “foo.json”: foo, } imports List of strings, optional List of import -J flags to be passed to the jsonnet compiler. vars String dict, optional Map of variables to pass to jsonnet via --var key=value. code_vars String dict, optional Map of code variables to pass to jsonnet via --code-var key=value.
Suppose you have the following directory structure:
[workspace]/
WORKSPACE
workflows/
BUILD
workflow.jsonnet
wordcount.jsonnet
intersection.jsonnet
Say that workflow.jsonnet is a base configuration library for a workflow scheduling system and wordcount.jsonnet and intersection.jsonnet both import workflow.jsonnet to define workflows for performing a wordcount and intersection of two files, respectively.
First, create a jsonnet_library target with workflow.jsonnet:
workflows/BUILD:
load("@bazel_tools//tools/build_defs/jsonnet:jsonnet.bzl", "jsonnet_library") jsonnet_library( name = "workflow", srcs = ["workflow.jsonnet"], )
To compile wordcount.jsonnet and intersection.jsonnet to JSON, define two jsonnet_to_json targets:
jsonnet_to_json( name = "wordcount", src = "wordcount.jsonnet", outs = ["wordcount.json"], deps = [":workflow"], ) jsonnet_to_json( name = "intersection", src = "intersection.jsonnet", outs = ["intersection.json"], deps = [":workflow"], )
To use Jsonnet's multiple output files, suppose you add a file shell-workflows.jsonnet that imports wordcount.jsonnet and intersection.jsonnet:
workflows/shell-workflows.jsonnet:
local wordcount = import "workflows/wordcount.jsonnet";
local intersection = import "workflows/intersection.jsonnet";
{
"wordcount-workflow.json": wordcount,
"intersection-workflow.json": intersection,
}
To compile shell-workflows.jsonnet into the two JSON files, wordcount-workflow.json and intersection-workflow.json, first create a jsonnet_library target containing the two files that shell-workflows.jsonnet depends on:
jsonnet_library( name = "shell-workflows-lib", srcs = [ "wordcount.jsonnet", "intersection.jsonnet", ], deps = [":workflow"], )
Then, create a jsonnet_to_json target and set outs to the list of output files to indicate that multiple output JSON files are generated:
jsonnet_to_json( name = "shell-workflows", src = "shell-workflows.jsonnet", deps = [":shell-workflows-lib"], outs = [ "wordcount-workflow.jsonnet", "intersection-workflow.jsonnet", ], )
jsonnet_to_json_test(name, src, deps, imports, golden, error=0, regex=False)
Suppose you have the following directory structure:
[workspace]/
WORKSPACE
config/
BUILD
base_config.jsonnet
test_config.jsonnet
test_config.json
Suppose that base_config.jsonnet is a library Jsonnet file, containing the base configuration for a service. Suppose that test_config.jsonnet is a test configuration file that is used to test base_config.jsonnet, and test_config.json is the expected JSON output from compiling test_config.jsonnet.
The jsonnet_to_json_test rule can be used to verify that compiling a Jsonnet file produces the expected JSON output. Simply define a jsonnet_to_json_test target and provide the input test Jsonnet file and the golden file containing the expected JSON output:
config/BUILD:
load( "@bazel_tools//tools/build_defs/jsonnet:jsonnet.bzl", "jsonnet_library", "jsonnet_to_json_test", ) jsonnet_library( name = "base_config", srcs = ["base_config.jsonnet"], ) jsonnet_to_json_test( name = "test_config_test", src = "test_config", deps = [":base_config"], golden = "test_config.json", )
To run the test: bazel test //config:test_config_test
Suppose you have the following directory structure:
[workspace]/
WORKSPACE
config/
BUILD
base_config.jsonnet
invalid_config.jsonnet
invalid_config.output
Suppose that invalid_config.jsonnet is a Jsonnet file used to verify that an invalid config triggers an assertion in base_config.jsonnet, and invalid_config.output is the expected error output.
The jsonnet_to_json_test rule can be used to verify that compiling a Jsonnet file results in an expected error code and error output. Simply define a jsonnet_to_json_test target and provide the input test Jsonnet file, the expected error code in the error attribute, and the golden file containing the expected error output:
config/BUILD:
load( "@bazel_tools//tools/build_defs/jsonnet:jsonnet.bzl", "jsonnet_library", "jsonnet_to_json_test", ) jsonnet_library( name = "base_config", srcs = ["base_config.jsonnet"], ) jsonnet_to_json_test( name = "invalid_config_test", src = "invalid_config", deps = [":base_config"], golden = "invalid_config.output", error = 1, )
To run the test: bazel test //config:invalid_config_test