包括第 3 方 protobuffer 定义文件

Including 3rd party protobuffer definition files

我有一个项目需要create/read其他项目生成的protobuf文件。

我要dlprimitives to be able to read files formatted as ONNX protobuf and Caffe protobuf

将它们包含到项目中的最佳方式是什么:

  1. 从原始存储库复制文件,并参考更新源的自述文件
  2. 制作caffe/onnx个外部子项目
  3. 构建时按需下载它们

我的想法:

  1. 普通副本不确定更新效果如何
  2. 创建巨大的子项目并增加单个文件的克隆时间,因为不可能有单个文件的子项目
  3. 假设构建环境可以访问互联网。

什么是更好的政策?一般是怎么解决的?

你所有的方法都是有效的。

  1. 协议缓冲区在设计上是向前或向后兼容的,因此手动更新是可以的。您可以通过记录任务或提供脚本/任务来缓解此问题。

  2. 外部子项目也可以,但您仍然需要手动更新它们(在 git 子模块的情况下)并处理原始项目中更改的路径。您可能需要考虑联系项目并建议将格式描述与主项目分开。

  3. 通常代理或缓存在这种情况下会有所帮助。现在很少有项目在没有外部依赖的情况下构建。

最后你应该考虑你的目标受众是什么。也许您可以从他们那里得到一些反馈,他们将如何使用您的项目?

ONNX 和 Caffe 是原型的真实来源,我不鼓励您制作原型的副本(因为副本是非最终的)。

关于@eik 的第二点,我认为 protobuf 维护者将 proto 保存在不同的 repos 中是一个很好的做法,这样这些 repos 更容易集成。我认为这应该被视为最佳实践,但很少有人这样做。有时,protobuf 维护者会在每次 proto 更改时生成多语言源,但这只是一种固定成本的节省,当然,您可以随时自己生成 SDK。

您引用的原型均未显示与存储库明显不同的版本。这也应该是最佳实践。

您应该为您的构建按需克隆|重新创建第 3 方原型存储库,保留存储库的参考并为您需要的任何语言构建客户端。这会保留原型合同(可能是版本化的)并与您生成的客户的(!)副本同步。

使用您的语言的包导入导入客户端 (pacakges)。例如,使用 Golang,您可以在 go.mod 中添加 replace 以从例如https://github.com/onnx/onnx 到您生成的客户端的副本。