使用 gradle 的典型方法是一步下载所有需要的包,然后在下一步构建。但假设您有数百个 gradle 项目,并且不想一步下载所有需要的包。我假设 bazel 有办法缓存每个包,对吗?如果是这样,它如何处理可能具有相同父包的并行下载包?它们可能会尝试同时写入相同的文件并发生冲突,对吗?父级未列在锁定文件中,因此如果不手动解析 pom 文件,很难知道以什么顺序下载内容。
使用 gradle 的典型方法是一步下载所有需要的包,然后在下一步构建。但假设您有数百个 gradle 项目,并且不想一步下载所有需要的包。我假设 bazel 有办法缓存每个包,对吗?如果是这样,它如何处理可能具有相同父包的并行下载包?它们可能会尝试同时写入相同的文件并发生冲突,对吗?父级未列在锁定文件中,因此如果不手动解析 pom 文件,很难知道以什么顺序下载内容。
这是一个两步过程:
pom.xml
,因此它必须使用外部 Maven 感知工具来解析顶级pom.xml
文件以生成完整包图的描述。正如您所说,这可能会导致菱形依赖关系。可以使用扩展 Bazel 来bzlmod
与这些工具集成。例如,rules_jvm_external
是一个bzlmod
使用Aether解析结构而无需下载工件的模块。BUILD
镜像结构的文件,如下所示:然后,Bazel 会分析此
BUILD
文件以创建自己的内部图形结构,并根据请求的构建目标,在以拓扑方式遍历和评估图形时根据需要获取 JAR。借助内存中的图形评估器和缓存,具有许多依赖项的包只会被获取并写入磁盘一次,因此文件不会被破坏。如果你有兴趣了解更多,请参阅Bazel的评估模型。