如何将变量传递给 Bazel 目标构建?

Héc*_*tor 5 environment-variables bazel

我正在尝试使用以下代码构建 Docker 映像:

container_image(
    name = "docker_image",
    base = "@java_base//image",
    files = [":executable_deploy.jar"],
    cmd = ["java", "-jar", "executable_deploy.jar"],
    env = { "VERSION" : "$(VERSION)" }
)
Run Code Online (Sandbox Code Playgroud)

我想将一个变量传递给构建的目标,以便可以在 $(VERSION) 中替换它。这可能吗?

我尝试过VERSION=1.0.0 bazel build :docker_image,但出现错误:

$(VERSION) 未定义。

我怎样才能传递这个变量?

根据文档

该字段(env)的值支持 make 变量(例如 $(FOO))和 stamp 变量;键也支持 make 变量。但我不明白这到底是什么意思。

Mat*_*kay 5

这些变量可以通过标志来设置--define

rules_docker 页面上有一个关于标记的部分涵盖了这一点。

本质上你可以做类似的事情: bazel build --define=VERSION=1.0.0 //:docker_image

还可以从stable-status.txtvolatile-status.txt文件中获取这些键/值对。bazel 的用户手册页显示了如何使用这些文件,以及如何--workspace_status_command填充它们。

要设置默认值,您可以使用一个.bazelrc文件,其内容如下所示:

build --define=VERSION=0.0.0-PLACEHOLDER
Run Code Online (Sandbox Code Playgroud)

命令行上传递的标志将优先于 .bazelrc 文件中的标志。

值得一提的是,更改define值将导致 bazel 再次分析所有内容,这可能需要一些时间,具体取决于图表,但只会执行受影响的操作。