bazel的编译中使用了Starlark语言,这种语言类似于python语言,详细内容可以参考 :https://docs.bazel.build/versions/4.2.1/skylark/language.html
本篇文章属于小白文章,只是为了把这个语言的具体内容罗列出来,方便后续参考。
一、Starlark语言简介:
语法格式如下所示:

load(":foo.bzl", "var", "fct") # loads `var`, and `fct` from `./foo.bzl`这里的load 的作用是引用指定bzl文件./foo.bzl里面的var和fct。
二、envoy里面的例子
Envoy里面的WORKSPACE里面就使用了Starlark语言,如下所示:
$ pwd
/Users/XXXX/envoy
$ cat WORKSPACE
workspace(name = "envoy")
// 备注:下面的load 是从/envoy/bazel/api_binding.bzl去执行envoy_api_binding()函数
load("//bazel:api_binding.bzl", "envoy_api_binding")
envoy_api_binding()
load("//bazel:api_repositories.bzl", "envoy_api_dependencies")
envoy_api_dependencies()
load("//bazel:repositories.bzl", "envoy_dependencies")
envoy_dependencies()
load("//bazel:repositories_extra.bzl", "envoy_dependencies_extra")
envoy_dependencies_extra()
load("//bazel:dependency_imports.bzl", "envoy_dependency_imports")
envoy_dependency_imports()如下所示:

引用的代码如下所示:
def envoy_api_binding():
# Treat the data plane API as an external repo, this simplifies exporting
# the API to https://github.com/envoyproxy/data-plane-api. This is the
# shadow API for Envoy internal use, see #9479.
if "envoy_api" not in native.existing_rules().keys():
_default_envoy_api(name = "envoy_api", reldir = "generated_api_shadow")
# We also provide the non-shadowed API for developer use (see #9479).
if "envoy_api_raw" not in native.existing_rules().keys():
_default_envoy_api(name = "envoy_api_canonical", reldir = "api")
# TODO(https://github.com/envoyproxy/envoy/issues/7719) need to remove both bindings and use canonical rules
native.bind(
name = "api_httpbody_protos",
actual = "@com_google_googleapis//google/api:httpbody_cc_proto",
)
native.bind(
name = "http_api_protos",
actual = "@com_google_googleapis//google/api:annotations_cc_proto",
)从上面的代码就可以看出来,这个api_binding.bzl文件里面的envoy_api_binding()函数跟python长得很像,代码比较简单,就不做解析。
星arlark语言入门:Envoy工作空间中的实践应用
本文介绍了Bazel编译系统中使用的Starlark语言,通过实例解析Envoy工作空间中的load函数和其在api_binding.bzl文件中的应用。学习者将了解如何像Python一样编写简单且实用的Bazel脚本。
1347

被折叠的 条评论
为什么被折叠?



