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

时间:2018-07-25 06:15:16

标签: c++ git git-submodules clion bazel

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

我正在处理一个c ++项目。称为项目A。

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

项目B也依赖于项目C。

所以看起来像这样。

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

我希望能够并行处理这3个项目,但我希望保持它们独立。

我尝试了几种设置方法:

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

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

  3. Git子模块,其中的子模块只是我依赖的软件包。 这将是我最喜欢的解决方案,但是如果执行此操作,则每个子模块(全部存储在third_party或其他目录中)中的BUILD文件都是无效的,因为它们本身依赖于外部依赖性。例如,项目B包括C作为外部依赖关系,而不是在我正在工作的工作空间中,而是在该工作空间C中是一个程序包。我能想到的处理这种情况的唯一方法是为包含Bazel库的每个程序包重写所有构建文件。这似乎没有效果。

我知道在google上我们使用的是其他版本,我们将其保留在内部工作区中,但是bazel必须有解决方案才能做到这一点。

2 个答案:

答案 0 :(得分:5)

对于类似的用例(在发送拉取请求之前测试对第三方依赖项的更改,我使用基于--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,但是我不愿意这样做,以免我提交的代码依赖于未提交的对依赖项的更改。

答案 1 :(得分:1)

因此,我发现可以使用的整体解决方案是创建一个monorepo并使用诸如copybara之类的工具来制作每个软件包的独立发行版。