Как разрешить пути относительно рабочего пространства в Bazel?

#bazel

Вопрос:

local_repository и new_local_repository оба принимают пути в качестве аргументов, и эти пути разрешаются относительно рабочей области.

 local_repository(  name = "my-ssl",  path = "../ssl", # relative to workspace )  

Я пытаюсь получить аналогичное поведение для пользовательского правила репозитория, но не могу его понять.

Похоже, что все repository_ctx функции работают относительно репозитория, а не рабочей области.

 my_repository(  name = "my-ssl",  path = "../ssl", # how can my rule resolve that path )  

Как я могу разрешить аргументы пути относительно рабочей области, как это делают встроенные правила репозитория?

Ответ №1:

Одним из вариантов может быть использование a Label("//:WORKSPACE") для получения каталога рабочей области и создания его с помощью вашего относительного пути:

 def _impl(repository_ctx):  workspace_dir = repository_ctx.path(Label("//:WORKSPACE")).dirname  repo_dir_str = '/'.join([str(workspace_dir), repository_ctx.attr.path])  print(repo_dir_str)   repo_dir = repository_ctx.path(repo_dir_str)  print(repo_dir)  print(repo_dir.exists)   my_repository = repository_rule(  implementation = _impl,  attrs = {  "path": attr.string(mandatory = True),  } )  

Рабочее пространство также может быть атрибутом, если это необходимо:

 my_repository = repository_rule(  implementation = _impl,  attrs = {  "path": attr.string(mandatory = True),  "workspace": attr.label(default = Label("//:WORKSPACE")),  } )