首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于bazel概念的几个问题

关于bazel概念的几个问题
EN

Stack Overflow用户
提问于 2019-11-08 21:33:23
回答 1查看 470关注 0票数 7

我正在学习Bazel,对许多基本概念感到困惑。

代码语言:javascript
复制
    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?

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

EN

回答 1

Stack Overflow用户

发布于 2019-11-09 00:50:40

Starlark宏是一个常规的Starlark函数,用于包装(和展开)规则。

代码语言:javascript
复制
def my_macro(name = ..., ...):
    native.cc_library(...)
    android_library(...)
    native.genrule(...)

可以将宏看作一种将多个规则链接和分组在一起的方法,它允许您通过管道将某些规则的输出输入到其他规则的输入中。在这个级别上,您不需要考虑规则是如何实现的,而是考虑它们与什么类型的输入和输出相关联。

另一方面,规则的声明是使用rule()函数完成的。cc_libraryandroid_librarygenrule都是规则。implementation规则抽象在一个常规函数中,该函数接受规则上下文(ctx)的单个参数。

代码语言:javascript
复制
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]))]

可以将操作看作是将多个命令行链接到一起并将其组合在一起的一种方法,它在单个文件级别工作,并运行可执行文件来转换它们(使用exectuableargsinputsoutputs参数的ctx.actions.run)。在规则实现中,您可以从规则属性(ctx.attr)或通过提供程序(例如ctx.attr.deps[0][DefaultInfo].files)从依赖项中提取信息

请注意,规则只能在构建文件中调用,而不能在工作区文件中调用。

@ 是资料档案库命名空间的表示法。 @bazel_gazelle是由资料档案库规则(非常规规则)在工作区中提取的外部资料档案库,通常为http_archivegit_repository。也可以从宏调用此存储库规则,如上面的my_macro或示例中的build_tools_deps

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58767580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档