我正在学习 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)
什么定义称为函数?什么定义是规则?
一个宏是一个普通的Starlark功能包装(并扩展至)规则。
def my_macro(name = ..., ...):
native.cc_library(...)
android_library(...)
native.genrule(...)
Run Code Online (Sandbox Code Playgroud)
将宏视为将多个规则链接和组合在一起的一种方式,它允许您将某些规则的输出通过管道传输到其他规则的输入中。在这个级别,您不考虑规则是如何实现的,而是考虑它们与哪些类型的输入和输出相关联。
另一方面,规则的 声明是使用rule()函数完成的。cc_library,android_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.run有exectuable,args,inputs和outputs参数)。在规则实现中,您可以从规则属性 ( ctx.attr) 或通过提供程序 (例如ctx.attr.deps[0][DefaultInfo].files) 的依赖项中提取信息
请注意,规则只能在 BUILD 文件中调用,而不能在 WORKSPACE 文件中调用。
@是存储库命名空间的表示法。 @bazel_gazelle是通过存储库规则(不是常规规则)在 WORKSPACE 中获取的外部存储库,通常为http_archive或git_repository。也可以从宏调用此存储库规则,如my_macro上面或build_tools_deps您的示例。
native.<rule name> 意味着该规则在 Bazel 中用 Java 实现并内置到二进制文件中,而不是在 Starlark 中。
| 归档时间: |
|
| 查看次数: |
387 次 |
| 最近记录: |