Struct 带方法的Skylark结构

Struct 带方法的Skylark结构,struct,bazel,skylark,starlark,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需要逐个加载函数 我可以使用st

我试着做了一件事,效果很好。我觉得它很有用,但感觉像是一个黑客,所以我担心它将来会崩溃

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

my_cc_library(name='a', srcs=['lib.c'])
my_cc_binary(name='b', deps=['a'], srcs=['main.c'])
这需要大量的
load
命令,这些命令很烦人,并且是重复的错误源。 如果是普通的Python,我只需导入整个模块。但是Skylark需要逐个加载函数

我可以使用struct消除对单个加载的需求

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用于本机规则的包装,以及各种其他函数

但是我滥用语言?它在将来容易崩溃吗


谢谢。

此模式在其他地方使用(例如),使用它是安全的

不过,并非所有工具都能很好地支持它。例如,您将无法使用更新构建文件-尽管这是可以修复的

这需要大量的
load
命令,这些命令很烦人,并且是重复的错误源

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


由于历史原因,生成文件中的规则看起来像
my\u cc\u library(…)
。很长一段时间,
load
不存在,所有规则都是在Bazel中硬编码的。也许我们应该鼓励使用
my.cc_库(…)
语法,让它更易于使用。

Laurent,Buildozer现在支持这个吗?使用这种模式容易吗?