contrib/ 目录中。
根据构建选项,其中一些库可能未编译,因此其功能在运行时可能不可用。
示例
添加和维护第三方库
contrib/ 目录下各自独立的目录中。
不要把外部代码的副本直接堆到库目录里。
而是应创建一个 Git 子模块,从外部上游仓库拉取第三方代码。
ClickHouse 使用的所有子模块都列在 .gitmodule 文件中。
- 如果该库可以直接使用 (默认情况) ,可以直接引用上游仓库。
- 如果该库需要打补丁,请在 GitHub 上的 ClickHouse organization 中为该上游仓库创建一个 fork。
ClickHouse/ 前缀的分支,例如 ClickHouse/2024_2 (对应分支 2024_2) 或 ClickHouse/release/vX.Y.Z (对应标签 release/vX.Y.Z) 。
不要跟随上游开发分支 master/ main / dev (也就是说,不要在 fork 仓库中使用 ClickHouse/master / ClickHouse/main / ClickHouse/dev 这类前缀分支) 。
这类分支一直在变化,会让正确的版本管理变得更困难。
“前缀分支”可确保将上游仓库的变更拉取到 fork 时,不会影响自定义的 ClickHouse/ 分支。
contrib/ 中的子模块只能跟踪已 fork 的第三方仓库中的 ClickHouse/ 分支。
补丁只应用到外部库的 ClickHouse/ 分支上。
有两种做法:
- 你想在 fork 仓库中某个带
ClickHouse/前缀的分支上新增一个修复,例如 sanitizer 修复。在这种情况下,将该修复推送为一个带ClickHouse/前缀的分支,例如ClickHouse/fix-sanitizer-disaster。然后从这个新分支向自定义跟踪分支创建一个 PR,例如ClickHouse/2024_2 <-- ClickHouse/fix-sanitizer-disaster,再合并该 PR。 - 你更新了子模块,并且需要重新应用之前的补丁。在这种情况下,重新创建旧 PR 就有些小题大做了。相反,只需将旧提交 cherry-pick 到新的
ClickHouse/分支中 (对应新版本) 。如果某些 PR 包含多个提交,可以放心把这些提交 squash。在最理想的情况下,我们已经把自定义补丁贡献回上游,因此在新版本中就可以省略这些补丁。