Жаворонок структура с методами
Вот что я пытался сделать, и это хорошо работает. Я нахожу это полезным, но это похоже на взлом, поэтому я боюсь, что это сломается в будущем.
Я работаю над преобразованием большого проекта в 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(...)
синтаксис и сделать его проще в использовании.