代码之家  ›  专栏  ›  技术社区  ›  Brandon Ross Pollack

如何在bazel中同时处理外部依赖项和我的项目?

  •  3
  • Brandon Ross Pollack  · 技术社区  · 6 年前

    我的问题是关于子项目,以及它们在bazel中的依赖关系。

    我在做一个c++项目。称之为A项目。

    A项目取决于我正在做的另外两个项目,B和C。

    项目B也取决于项目C。

    所以看起来是这样。

    A -> (B, C)
    B -> (C)
    C -> no external dependencies
    

    我想能够同时完成这三个项目,但我想保持它们的独立性。

    我试过几种设置方法:

    1. 我的工作区文件中git的外部依赖项。这里的问题是,当我希望对它们进行更改时,如果它们是一个更大的项目,它们就不会保持同步。工作流程还需要不断地切换目录、推送我的存储库、返回到另一个存储库并潜在地拉取(如果bazel决定这么做,仍然不知道如何强制)。

    2. Git子模块&存储库中的外部依赖项。这里的问题是在CLion中,或者我用来跳转到引用的任何东西中,实际上是从一个专门创建的bazel缓存中获得它的引用,而不是我希望提交的实际repo。

    3. Git子模块,其中的子模块只是我所依赖的包。 这是我最喜欢的解决方案,但是如果我这样做,每个子模块中的构建文件(都存储在第三方或其他目录中)都是无效的,因为它们本身依赖于外部依赖关系。例如,项目B将C作为一个外部依赖项包含在我正在工作的工作区之外,但是在这个工作区中C是一个包。我能想到的管理这种情况的唯一方法是重写Bazel库以这种方式包含的每个包的所有构建文件。这似乎没有成效。

    我知道在google,我们使用不同的版本,并将其全部保存在一个内部工作区中,但bazel必须有一个解决方案才能做到这一点。

    2 回复  |  直到 6 年前
        1
  •  5
  •   Rodrigo Queiro    6 年前

    对于类似的用例(在发送pull请求之前测试对第三方依赖项的更改,我使用基于 --override_repository . 这告诉Bazel不要从Github中提取给定的外部存储库,而是在本地磁盘上使用一个副本。

    例如,在您的情况下,我可能有这样的布局:

    > ls ~/git
    project_a
    project_b
    project_c
    

    我可以在里面改变一下 ~/git/project_b 然后按如下方式构建项目A:

    cd ~/git/project_b
    # edit files
    cd ~/git/project_a
    bazel build //... --override_repository com_github_username_project_b=$HOME/git/project_b
    

    你也可以加一行 build --override_repository name=/path/to/repo .bazelrc 但我不喜欢这样做,以免我提交依赖于未提交的依赖项更改的代码。

        2
  •  1
  •   Brandon Ross Pollack    6 年前

    因此,我找到的总体解决方案是创建一个monorepo,并使用copybara这样的工具来制作每个包的独立版本。