我正在学习Bazel,对许多基本概念感到困惑。
load("//bazel/rules:build_tools.bzl", "build_tools_deps")
build_tools_deps() //build_tools_deps is macro or rules?
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies")
gazelle_dependencies() //what about the @ mean exactly? where is the bazel_gazelle ?
native.new_git_repository(...) //what about the native mean?什么定义被称为函数?什么是规则的定义?
发布于 2019-11-09 00:50:40
Starlark宏是一个常规的Starlark函数,用于包装(和展开)规则。
def my_macro(name = ..., ...):
native.cc_library(...)
android_library(...)
native.genrule(...)可以将宏看作一种将多个规则链接和分组在一起的方法,它允许您通过管道将某些规则的输出输入到其他规则的输入中。在这个级别上,您不需要考虑规则是如何实现的,而是考虑它们与什么类型的输入和输出相关联。
另一方面,规则的声明是使用rule()函数完成的。cc_library、android_library和genrule都是规则。implementation的规则抽象在一个常规函数中,该函数接受规则上下文(ctx)的单个参数。
my_rule = rule(
attrs = { ... },
implementation = _my_rule_impl,
)
def _my_rule_impl(ctx):
outfile = ctx.actions.declare_file(...)
ctx.actions.run(...)
return [DefaultInfo(files = depset([outfile]))]可以将操作看作是将多个命令行链接到一起并将其组合在一起的一种方法,它在单个文件级别工作,并运行可执行文件来转换它们(使用exectuable、args、inputs和outputs参数的ctx.actions.run)。在规则实现中,您可以从规则属性(ctx.attr)或通过提供程序(例如ctx.attr.deps[0][DefaultInfo].files)从依赖项中提取信息
请注意,规则只能在构建文件中调用,而不能在工作区文件中调用。
@ 是资料档案库命名空间的表示法。 @bazel_gazelle是由资料档案库规则(非常规规则)在工作区中提取的外部资料档案库,通常为http_archive或git_repository。也可以从宏调用此存储库规则,如上面的my_macro或示例中的build_tools_deps。
native.<rule name>意味着规则是用Java语言在Bazel中实现的,并内置于二进制文件中,而不是Starlark中。
https://stackoverflow.com/questions/58767580
复制相似问题