簡體   English   中英

雲雀結構與方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM