云雀结构与方法

时间:2018-08-15 14:09:24

标签: struct bazel skylark starlark

这是我尝试做的事情,并且效果很好。我发现它很有用,但感觉像是一种破解,所以恐怕将来会破灭。

我正在将一个大型项目转换为Bazel,我们有很多本地包装器,例如:

my_cc_library(name='a', srcs=['lib.c'])
my_cc_binary(name='b', deps=['a'], srcs=['main.c'])

这需要大量load命令,这些命令很烦人,并且重复出现错误。 如果是普通的Python,我只需导入整个模块。但是Skylark要求一一加载函数。

我可以使用结构消除对单个负载的需求。

my.bzl中:

def _my_cc_library(...): ...
def _my_cc_binary(...): ...

my = struct(cc_library=_my_cc_library, cc_binary=_my_cc_binary)

在各种BUILD文件中:

load('//my.bzl', 'my')
my.cc_library(name='a', srcs=['lib.c'])
my.cc_binary(name='b', deps=['a'], srcs=['main.c'])

正如我上面所写,这一切都很好。我可以将if用于本地规则的包装器以及其他各种功能。

但是我在滥用语言吗?将来容易突破吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

此模式在其他地方(例如https://github.com/bazelbuild/bazel-skylib/blob/master/lib/collections.bzl)使用,因此可以安全使用。

不过,并非所有工具都支持它。例如,您将无法使用Buildozer更新BUILD文件-尽管该文件可以修复。

  

这需要大量load命令,这些命令很烦人,并且重复出现错误。

我同意这很烦人。将来,我们应该拥有更好的工具来更新load行(以自动添加/删除它们)。

由于历史原因,BUILD文件中的规则看起来像my_cc_library(...)。长期以来,load不存在,并且所有规则都在Bazel中进行了硬编码。也许我们应该鼓励my.cc_library(...)语法并使其更易于使用。