struct - 带有方法的云雀结构
问题描述
这是我尝试做的事情,而且效果很好。我觉得它很有用,但感觉就像是 hack,所以我担心它将来会坏掉。
我正在将一个大型项目转换为 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 用于本地规则的包装器,以及各种其他功能。
但是我滥用语言?以后容易坏吗?
谢谢。
解决方案
此模式在其他地方使用(例如https://github.com/bazelbuild/bazel-skylib/blob/master/lib/collections.bzl),使用它是安全的。
不过,并非所有工具都能很好地支持它。例如,您将无法使用Buildozer更新您的 BUILD 文件——尽管它是可以修复的。
这需要很多
load
命令,这些命令很烦人,并且是重复的错误来源。
我同意这很烦人。将来,我们应该有更好的工具来更新load
行(自动添加/删除它们)。
BUILD 文件中的规则看起来像my_cc_library(...)
由于历史原因。很长一段时间,load
不存在,所有规则都在 Bazel 中硬编码。也许我们应该鼓励my.cc_library(...)
语法并使其更易于使用。
推荐阅读
- javascript - 查找并选择不包含按钮的“li”
- android - Face API - 情绪属性的变化
- java - 比较字符串格式的两个日期
- xamarin.forms - 是否可以将 FFImageLoading 与 Mr.Gestures 结合使用?
- r - 使用 dplyr 生成具有累积总和的新列
- c# - 使用接口来利用基本的 Unity 方法?
- logging - 在 AWS Lambas 中使用 slf4j(和 io.symphonia:lambda-logging)进行日志记录时,CloudWatch 输出中的新行问题
- java - 如何在 JavaFX Scene Builder 中添加随机计时器循环?
- ruby - 带参数的 FactoryBot 序列
- terminal - 如何更改 VSCode 集成终端用户界面?