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

How can work on an external dependency and my project at the same time in bazel?

本文关键字:依赖 外部 项目 我的 处理 bazel      更新时间:2023-10-16

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

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

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

项目B也依赖于项目C。

所以它看起来是这样的。

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

我希望能够同时处理这三个项目,但我希望保持它们的独立性。

我已经尝试了几种设置方法:

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

  2. Git子模块&存储库中的外部依赖关系。这里的问题是在CLion中,或者我用来跳转到引用的任何东西实际上都是从某个特定创建的bazel缓存中获得引用的,而不是我想要提交的实际回购。

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

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

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

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

ls~/git项目a项目bproject_c

我可以在~/git/project_b内部进行更改,然后按照如下方式构建项目a:

cd~/git/project_b#编辑文件cd~/git/project_a巴泽尔建筑//--override_repository com_github_username_project_b=$HOME/git/project_b

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

因此,我发现的总体解决方案是创建一个monorepo,并使用copybara等工具对每个包进行独立发布。