Bazel可以依赖其他项目的目标。来自其他项目的依赖关系称为外部依赖关系。

    其他项目包含一个或多个具有targetBUILD,在主项目中的BUILD通过使用来自WORKSPACE的名称实现对外部targets的依赖。

    1. #现有如下两个项目
    2. /
    3. home/
    4. user/
    5. project1/
    6. WORKSPACE
    7. BUILD
    8. srcs/
    9. ...
    10. project2/
    11. WORKSPACE
    12. BUILD
    13. my-libs/

    project1依赖project2中的一个目标:foo,defined in /home/user/project2/BUILD,它可以指定一个名为project2的存储库可以在/home/user/project2中找到 ,则project1中的BUILD的目标的依赖对象为:@project2//:foo


    依赖其他bazel项目

    1. local_repository:本地文件系统

    假设你的项目为my-project/,你同事的项目为coworkers-project/,两个项目均基于Bazel,你需要依赖你同事项目中的target。故可在my-projects/WORKSPACE中加入:

    1. local_repository(
    2. name = "coworkers-project",
    3. path = "/path/to/coworkers-project",
    4. )

    若你想依赖同时项目中的//foo:bar,则可在BUILD的目标中添加依赖@coworkers-project//foo:bar

    1. git_repository:git仓库

    2. http_archive:下载


    依赖非bazel项目
    new_为前缀的规则,例如new_local_repository,允许您从不使用Bazel从项目中创建目标。
    例子同上,只不过此时同事使用make去构建项目。而你需要依赖其构建出的某个.so文件。
    步骤如下:

    1. 修改my_project/WORKSPACE

      1. new_local_repository(
      2. name = "coworkers_project",
      3. path = "/path/to/coworkers-project",
      4. build_file = "coworker.BUILD",
      5. )
    2. build_file指定一个要覆盖在现有项目上的BUILD文件

      1. cc_library(
      2. name = "some-lib",
      3. srcs = glob(["**"]),
      4. visibility = ["//visibility:public"],
      5. )
    3. 修改my_project中的BUILD

    @coworkers_project//:some-lib

    Fetching dependencies(没懂)
    默认情况下,在bazel构建过程中会根据需要获取外部依赖项。如果您想预取特定目标集所需的依赖项,请使用bazel fetch。要无条件地获取所有外部依赖,请使用bazel syn。由于获取的存储库存储在输出库中,所以每个工作空间都会进行获取。


    最佳实践

    1. 相较于git_repositorynew_git_repository,多用http_archive
    2. 库的规则
      1. 检测系统设置并将其写入文件。
      2. 在系统的其他地方查找资源。
      3. 从url下载资源。
      4. 将BUILD文件生成或符号链接到外部存储库目录中。

    避免使用repository_ctx。例如,当使用使用Make构建的非bazel c++库时,最好使用repository_ctx.download(),然后编写一个构建文件来构建它,而不是运行ctx.execute([" Make "])。