首页 文章

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

提问于
浏览
3

我的问题是关于子项目,并与他们在bazel中的依赖关系一起工作 .

我有一个我正在研究的项目 . 称之为项目A.

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

项目B还取决于项目C.

所以它看起来像这样 .

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

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

我尝试了几种设置方法:

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

  • 存储库中的Git子模块和外部依赖项 . 这里的问题是在CLion或我用来跳转到引用的任何地方实际上从某个地方创建的bazel缓存中获取它的引用,而不是我想要提交的实际repo .

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

我知道在谷歌我们使用不同版本的这个并且我们将它全部保存在内部工作区中,但是必须有一个解决方案让bazel这样做 .

2 回答

  • 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 但我不想这样做,以免我提交依赖于未提交的依赖项更改的代码 .

  • 0

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

相关问题