Bazel中的可选文件依赖项?

Bazel中的可选文件依赖项?,bazel,Bazel,有没有办法在Bazel中指定可选依赖项 我想制定一个规则,在某种程度上镜像Kitware,但我想看看是否可以启用开发人员在树中编辑文件的工作流,理想情况下无需修改构建文件 理想工作流 定义一个规则,external_data,该规则可以从给定服务器获取给定SHA-512的文件 如果文件已经存在,请检查其SHA-512。 如果这是所请求的,则符号链接/复制此文件(确保没有测试可以修改原始文件) 如果不同,则打印一条警告,但继续正常操作,以允许开发人员根据需要快速修改大型文件 我希望这样做,

有没有办法在Bazel中指定可选依赖项

我想制定一个规则,在某种程度上镜像Kitware,但我想看看是否可以启用开发人员在树中编辑文件的工作流,理想情况下无需修改
构建
文件

理想工作流
  • 定义一个规则,
    external_data
    ,该规则可以从给定服务器获取给定SHA-512的文件
  • 如果文件已经存在,请检查其SHA-512。
    • 如果这是所请求的,则符号链接/复制此文件(确保没有测试可以修改原始文件)
    • 如果不同,则打印一条警告,但继续正常操作,以允许开发人员根据需要快速修改大型文件
我希望这样做,以便Bazel可以在文件存在和不存在之间切换,并且对缓存上的误报具有鲁棒性。如果不将其作为可选依赖项包含,我希望避免的示例场景:

  • 在之前的一次运行中,文件在工作区中,Bazel构建了目标,一切都很好
  • 开发人员在上传后从工作区中删除该文件,对其更改感到满意,并希望测试下载过程
  • 运行下游目标时,Bazel不关心工作区中的更改,因为它不是显式依赖项,符号链接无效,测试崩溃并烧毁
  • 在我看来,如果我试图实现一个
    存储库\规则
    规则
    ,它手动检查文件是否存在,并有条件地执行(我不确定如果发生第2步,分析是否会重新触发正在“评估”的规则),我就会遇到这种情况

    变通办法 我目前对替代工作流的想法是为
    外部\u数据
    使用工作区
    :如果
    为False
    ,它将下载文件;如果
    True
    ,它将只镜像
    导出\u文件([])
    。然后,开发人员可以在修改文件时设置此选项


    (理想情况下,我希望有选择地包含一个表示SHA的文件(
    ${file}.sha512
    ),但这似乎回到了最初的问题。)

    一个解决方法是使用Bazel的
    glob(…)
    方法来有效地检查文件是否存在

    如果您有一个文件,比如说
    basic.bin.sha512
    ,并且您想要一个规则根据该文件的存在来切换模式,那么您可以使用
    glob([“basic.bin.sha512”])
    ,它将精确匹配包文件或返回空列表

    我在更大的文件集上尝试过使用它,它似乎可以工作。然而,就目前而言,我的目标定义有一种明确的“开发”模式,以保持Bazel构建相对一致,而不管可能签出哪些文件

    下面是一个示例用法:


    我是否正确理解您需要一个存储库规则,该规则可以首先签入某个目标的本地存储库(),如果不存在,则从URL获取存储库/文件?本地_repository()和http_archive()的组合?很抱歉,我的意思只是一个
    规则。这只适用于存储库中的文件,不一定是单独的工作区/存储库。谢谢你的邀请!此外,我可能有一个解决办法;我将发布可能的解决方案,但将这个问题保留一段时间。