[英]Skylark struct with methods
这是我尝试做的事情,并且效果很好。 我觉得它很有用,但感觉就像一个黑客,所以我担心它将来会崩溃。
我正在将一个大型项目转换为 Bazel,我们有很多本地包装器,例如:
my_cc_library(name='a', srcs=['lib.c'])
my_cc_binary(name='b', deps=['a'], srcs=['main.c'])
这需要大量的load
命令,这些命令很烦人,而且是重复的错误来源。 如果是普通的 Python,我只需导入整个模块。 但是云雀需要一一加载函数。
我可以使用结构消除对单个负载的需求。
在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 用于本机规则的包装器以及各种其他功能。
但是我滥用语言? 以后容易坏吗?
谢谢。
此模式用于其他地方(例如https://github.com/bazelbuild/bazel-skylib/blob/master/lib/collections.bzl ),使用它是安全的。
不过,并非所有工具都能很好地支持它。 例如,您将无法使用Buildozer更新您的 BUILD 文件 - 尽管它可以修复。
这需要大量的
load
命令,这些命令很烦人,而且是重复的错误来源。
我同意这很烦人。 将来,我们应该有更好的工具来更新load
线(自动添加/删除它们)。
由于历史原因,BUILD 文件中的规则看起来像my_cc_library(...)
。 很长一段时间, load
都不存在,所有规则都是在 Bazel 中硬编码的。 也许我们应该鼓励my.cc_library(...)
语法并使其更易于使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.