带有方法的 Skylark 结构
Skylark struct with methods
这是我尝试做的事情,效果很好。觉得有用,不过感觉有点hack,怕以后坏了。
我正在将一个大型项目转换为 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 文件 - 尽管它可以修复。
This requires lots of load
commands, which are annoying and a repeating source of errors.
我同意这很烦人。将来,我们应该有更好的工具来更新 load
行(自动 add/remove 它们)。
由于历史原因,BUILD 文件中的规则看起来像 my_cc_library(...)
。很长一段时间,load
并不存在,所有规则都硬编码在 Bazel 中。也许我们应该鼓励 my.cc_library(...)
语法并使其更易于使用。
这是我尝试做的事情,效果很好。觉得有用,不过感觉有点hack,怕以后坏了。
我正在将一个大型项目转换为 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 文件 - 尽管它可以修复。
This requires lots of
load
commands, which are annoying and a repeating source of errors.
我同意这很烦人。将来,我们应该有更好的工具来更新 load
行(自动 add/remove 它们)。
由于历史原因,BUILD 文件中的规则看起来像 my_cc_library(...)
。很长一段时间,load
并不存在,所有规则都硬编码在 Bazel 中。也许我们应该鼓励 my.cc_library(...)
语法并使其更易于使用。