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
)
如何解决相对于工作区的路径参数,就像内置的存储库规则一样?
一种选择是使用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")),
}
)