如何在 bazel 中同时处理外部依赖项和我的项目?
How can work on an external dependency and my project at the same time in bazel?
我的问题是关于子项目以及在 bazel 中处理它们以及它们的依赖项。
我有一个正在处理的 C++ 项目。称之为项目 A.
项目 A 依赖于我正在处理的另外 2 个,B 和 C。
项目 B 也依赖于项目 C。
所以它看起来像这样。
A -> (B, C)
B -> (C)
C -> no external dependencies
我希望能够并行处理这 3 个项目,但我想让它们保持独立。
我已经尝试了几种设置方法:
我的 WORKSPACE 文件中 git 的外部依赖项。这里的问题是,当我希望对它们进行更改时,就好像它们是一个更大的项目一样,它们不会保持同步。工作流程也很糟糕,不断切换目录,推送我的存储库,返回到另一个存储库,并可能拉取(如果 bazel 决定这样做,仍然不知道如何强制执行)。
Git 存储库中的子模块和外部依赖项。这里的问题出在 CLion 或我用来跳转到引用的任何东西实际上是从某处专门创建的 bazel 缓存获取其引用,而不是我希望提交的实际回购。
Git 子模块,其中子模块只是我所依赖的包。
这将是我最喜欢的解决方案,但如果我这样做,每个子模块中的 BUILD 文件(全部存储在 third_party 或其他目录中)都是无效的,因为它们本身依赖于外部依赖项。例如,项目 B 将 C 作为外部依赖包含在我正在工作的工作区中,但在此工作区中 C 是一个包。我能想到的管理这种情况的唯一方法是以这种方式为包含 Bazel 库的每个包重写所有构建文件。这似乎没有成效。
我知道 google 我们使用了不同的版本,我们将其全部保存在内部工作区中,但是 bazel 必须有解决方案才能做到这一点。
对于类似的用例(在发送拉取请求之前测试对第三方依赖项的更改,我使用基于 --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
您还可以在 .bazelrc
中添加一行 build --override_repository name=/path/to/repo
,但我不想这样做,以免我提交的代码依赖于对依赖项的未提交更改。
所以我发现的整体解决方案是创建一个 monorepo 并使用像 copybara 这样的工具来制作每个包的独立版本。
我的问题是关于子项目以及在 bazel 中处理它们以及它们的依赖项。
我有一个正在处理的 C++ 项目。称之为项目 A.
项目 A 依赖于我正在处理的另外 2 个,B 和 C。
项目 B 也依赖于项目 C。
所以它看起来像这样。
A -> (B, C)
B -> (C)
C -> no external dependencies
我希望能够并行处理这 3 个项目,但我想让它们保持独立。
我已经尝试了几种设置方法:
我的 WORKSPACE 文件中 git 的外部依赖项。这里的问题是,当我希望对它们进行更改时,就好像它们是一个更大的项目一样,它们不会保持同步。工作流程也很糟糕,不断切换目录,推送我的存储库,返回到另一个存储库,并可能拉取(如果 bazel 决定这样做,仍然不知道如何强制执行)。
Git 存储库中的子模块和外部依赖项。这里的问题出在 CLion 或我用来跳转到引用的任何东西实际上是从某处专门创建的 bazel 缓存获取其引用,而不是我希望提交的实际回购。
Git 子模块,其中子模块只是我所依赖的包。 这将是我最喜欢的解决方案,但如果我这样做,每个子模块中的 BUILD 文件(全部存储在 third_party 或其他目录中)都是无效的,因为它们本身依赖于外部依赖项。例如,项目 B 将 C 作为外部依赖包含在我正在工作的工作区中,但在此工作区中 C 是一个包。我能想到的管理这种情况的唯一方法是以这种方式为包含 Bazel 库的每个包重写所有构建文件。这似乎没有成效。
我知道 google 我们使用了不同的版本,我们将其全部保存在内部工作区中,但是 bazel 必须有解决方案才能做到这一点。
对于类似的用例(在发送拉取请求之前测试对第三方依赖项的更改,我使用基于 --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
您还可以在 .bazelrc
中添加一行 build --override_repository name=/path/to/repo
,但我不想这样做,以免我提交的代码依赖于对依赖项的未提交更改。
所以我发现的整体解决方案是创建一个 monorepo 并使用像 copybara 这样的工具来制作每个包的独立版本。