#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")), } )