Жаворонок структура с методами

Вот что я пытался сделать, и это хорошо работает. Я нахожу это полезным, но это похоже на взлом, поэтому я боюсь, что это сломается в будущем.

Я работаю над преобразованием большого проекта в 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'])

Как я уже писал выше, все работает хорошо. Я могу использовать если для оберток к родным правилам, а также для различных других функций.

Но я злоупотребляю языком? Это склонно ломаться в будущем?

Благодарю.

1 ответ

Решение

Этот шаблон используется в других местах (например, https://github.com/bazelbuild/bazel-skylib/blob/master/lib/collections.bzl), его можно использовать безопасно.

Не все инструменты поддерживают это хорошо, все же. Например, вы не сможете обновить файлы BUILD с помощью Buildozer - хотя это можно исправить.

Это требует много load Команды, которые раздражают и повторяют источник ошибок.

Я согласен, это раздражает. В будущем у нас должны быть лучшие инструменты для обновления load линии (для автоматического добавления / удаления их).

Правила в файлах BUILD выглядят так my_cc_library(...) по историческим причинам. В течение долгого времени, load не существовало, и все правила были жестко закодированы в Базеле. Может быть, мы должны поощрять my.cc_library(...) синтаксис и сделать его проще в использовании.

Другие вопросы по тегам