В структуре моего проекта есть несколько подмодулей, это, по сути, папки, которые также являются проектами в рамках своих собственных прав.
Для данного проекта Python, каждый с подпроектами. Я хотел бы иметь возможность написать макрос, который может создать набор действий, которые будут предприняты для данного подпроекта.
По сути, что-то в этом духе внутри рабочего пространства:
load("@io_bazel_rules_python//:python/pip.bzl",
"pip_import"
)
pip_import(
name = "foo",
requirements = "@subprojectname//:requirements.txt",
)
load("@foo//:requirements.bzl", "pip_install")
pip_install()
Есть несколько подпроектов, для которых я хотел бы выполнить вышеуказанные действия. Однако, если я помещу весь код в функцию внутри bzl-файла.
pyrules.bzl
load("@io_bazel_rules_python//:python/pip.bzl",
"pip_import"
)
def doit(name):
pip_import(
name = "foo",
requirements = "@{repo}//:requirements.txt".format(repo=name)
)
load("@foo//:requirements.bzl", "pip_install")
pip_install()
Я не могу использовать вторую команду загрузки из-за «синтаксической ошибки при« нагрузке »: ожидаемое выражение». Если у вас нет нескольких bzl-файлов, которые загружаются в родительский WORKSPACE, есть ли другой способ создать повторно используемые куски логики?
Обновление 1.
Комментарии просили больше информации о рабочем процессе. Предупреждение, у меня есть нестандартный макет того, как Bazel, кажется, используется в другом месте, где не монорепо. Но это должно прийти к аналогичной практической планировке.
Проекты размечены как:
projectname/
WORKSPACE
BUILD
src/
stuff
submodule/ # < git modules that are checked out into folder
subproject1/
BUILD
src/
stuff
subproject2/
BUILD
src/
stuff
Во-первых, у меня есть repository_rule, который загружается в WORKSPACE, который находит все проекты в папке субмодулей и добавляет их в качестве репозиториев. В рамках подпроекта некоторые из них являются Python. Я хотел бы загрузить его файлы require.txt. Отсюда и общий вопрос о том, где находятся эти файлы needs.txt и как их установить. В идеале я хотел бы, чтобы определения py_library в файлах BUILD подпроектов знали, что существует зависимость от файла требований подпроекта, но это, вероятно, не имеет значения, поскольку родительский файл BUILD - это единственное, что создает par_binaries и т. Д., поэтому до тех пор, пока происходит установка pip_install и установка зависимостей, сам проект должен быть пригодным для использования.
Bazel не позволяет дочернему проекту определять свои собственные действия с репозиторием, как описано выше pip_install. Я предполагаю, что это потому, что вы не можете выполнять действия с репозиторием в файле BUILD, а дочерние файлы WORKSPACE, похоже, не имеют никакого эффекта. Поэтому мне пришлось добавить это в родительский файл WORKSPACE.
Если он находится в родительском рабочем пространстве, я должен скопировать и вставить действия pip для каждого из подпроектов, которые я хочу использовать. Тем не менее, я бы предпочел просто установить общее правило, которое бы находило файл требований и устанавливал их в pip. Попытка сделать макрос из этого, однако, означает, что я не могу использовать вызов загрузки внутри него. Кажется, что все действия pip должны взаимодействовать с действиями с хранилищем, которые затем должны вызываться только из родительского файла WORKSPACE.