Bazel中的可选文件依赖项?

时间:2017-10-20 16:08:28

标签: bazel

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

我想制定一个规则来反映Kitware的ExternalData,但我想看看我是否可以启用开发人员在树中编辑文件的工作流程,理想情况下没有需要修改BUILD文件。

理想工作流程

  • 定义一个规则external_data,该规则可以在给定SHA-512的情况下从给定服务器获取文件。
  • 如果文件已存在,请检查它的SHA-512。
    • 如果这是请求的内容,则符号链接/复制此文件(确保没有测试可以修改原始文件)。
    • 如果不同,请打印警告,但正常进行,以允许开发人员根据需要快速修改大文件。

我想这样做,以便Bazel可以在文件存在与否之间切换,并且对于缓存的误报是健壮的。我想避免的一个示例场景,如果我不将其作为可选依赖项包含它:

  1. 在之前的一次运行中,文件在工作区中,Bazel构建了目标,一切都很好,花花公子。
  2. 开发人员在上传后从工作区中删除文件,对其更改感到满意,并希望测试下载过程。
  3. 当运行下游目标时,Bazel并不关心工作区中的更改,因为它不是显式依赖项,并且符号链接无效,测试崩溃并烧毁。
  4. 对我来说,如果我试图实现一个 repository_rule rule来手动检查文件的存在,并且有条件地执行(我不确定分析是否会重新触发此规则"评估"如果步骤2发生。)。

    解决方法

    我目前对替代工作流程的想法是为external_datause_workspace提供明确的选项:if False,它会下载文件;如果True,它只会镜像exports_files([])。然后开发人员可以在修改文件时设置它。

    (理想情况下,我希望可选包含一个指示SHA(${file}.sha512)的文件,但这似乎又回到原来的问题。)

1 个答案:

答案 0 :(得分:0)

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

如果您有一个文件,比如basic.bin.sha512,并且您希望规则根据该文件的存在来切换模式,则可以使用glob(["basic.bin.sha512"]),它将与包文件完全匹配或返回空列表。

我曾经在更大的文件集上使用它,并且看起来很有效。但是,就目前而言,我错误地为目标定义采用了一种明确的“开发”模式,以保持Bazel构建相对一致,无论可以检出哪些文件。

以下是一个示例用法:

https://github.com/EricCousineau-TRI/external_data_bazel/blob/4bf1dff/WORKFLOWS.md#edit-files-in-a-sha512-group