关于bazel概念的一些问题

din*_*rui 7 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?
Run Code Online (Sandbox Code Playgroud)

什么定义称为函数?什么定义是规则?

Jin*_*Jin 5

一个是一个普通的Starlark功能包装(并扩展至)规则。

def my_macro(name = ..., ...):
    native.cc_library(...)
    android_library(...)
    native.genrule(...)
Run Code Online (Sandbox Code Playgroud)

将宏视为将多个规则链接和组合在一起的一种方式,它允许您将某些规则的输出通过管道传输到其他规则的输入中。在这个级别,您不考虑规则是如何实现的,而是考虑它们与哪些类型的输入和输出相关联。

另一方面,规则的 声明是使用rule()函数完成的。cc_libraryandroid_library并且genrule是所有规则。该规则 的实施在接受该规则范围内的单个参数常规功能抽象(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]))]
Run Code Online (Sandbox Code Playgroud)

的行为视为一种对链和组几个命令行在一起,这在单个文件和运行可执行文件的层次共同改变他们(ctx.actions.runexectuableargsinputsoutputs参数)。在规则实现中,您可以从规则属性 ( ctx.attr) 或通过提供程序 (例如ctx.attr.deps[0][DefaultInfo].files) 的依赖项中提取信息

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

@是存储库命名空间的表示法。 @bazel_gazelle是通过存储库规则(不是常规规则)在 WORKSPACE 中获取的外部存储库,通常为http_archivegit_repository。也可以从宏调用此存储库规则,如my_macro上面或build_tools_deps您的示例。

native.<rule name> 意味着该规则在 Bazel 中用 Java 实现并内置到二进制文件中,而不是在 Starlark 中。