关于bazel概念的一些问题

时间:2019-11-08 13:33:22

标签: bazel

我正在学习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?

//What definition is called a function? what definition is a rule?

1 个答案:

答案 0 :(得分:2)

是常规的Starlark函数,用于包装(并扩展为)规则。

def my_macro(name = ..., ...):
    native.cc_library(...)
    android_library(...)
    native.genrule(...)

将宏视为将多个规则链接和分组在一起的一种方法,它使您可以将某些规则的输出传递到其他规则的输入中。在此级别上,您无需考虑规则的实施方式,而可以考虑它们与什么样的输入和输出相关联。

另一方面,规则 声明是使用rule()函数完成的。 cc_libraryandroid_librarygenrule都是规则。 规则 实现是在常规函数中抽象的,该常规函数接受规则上下文(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]))]

将动作视为将多个命令行链接和分组在一起的一种方法,它可以在单个文件级别运行,并运行可执行文件以对其进行转换(ctx.actions.runexectuable,{{1} },argsinputs参数)。在规则实施中,您可以从规则属性(outputs)或通过提供程序的依赖项(例如ctx.attr)中提取信息

请注意,规则只能在BUILD文件中调用,而不能在WORKSPACE文件中调用。

ctx.attr.deps[0][DefaultInfo].files是存储库名称空间的表示法。 @是通过存储库规则在WORKSPACE中获取的外部存储库(不是常规规则),通常为@bazel_gazellehttp_archive。也可以从宏中调用此存储库规则,例如上面的git_repository或示例中的my_macro

build_tools_deps表示该规则是在Java中在Bazel中实现的,并内置在二进制文件中,而不是在Starlark中。