语境
我正在尝试在Bazel中做一些 protobuf 代码生成,最终使用rules_proto_grpc,但正如我所见,内核正在使用rules_proto,我们现在可以专注于这些。
总体思路是构建一个包含多个 API 实例的monorepo,所有实例都共享/专门化一个公共基础/核心 API。
简化后,它看起来像:
generic-api/
service.proto
import "generic-api/service_impl/service_info.proto"
service Service {
rpc ServiceInfo(RequestServiceInfo) returns (ResponseServiceInfo) {}
}
service_impl/
service_info.proto
// Modelling this import is probably the core issue!
import "generic-api/specific_impl/X/specific_service_info.proto";
message RequestServiceInfo {}
message ResponseServiceInfo {
repeated SpecificServiceInfo specific_info = 1;
}
specific_impl/
service_a/
specific_service_info.proto
message SpecificServiceInfo {
string sometext = 1;
}
service_b/
specific_service_info.proto
message SpecificServiceInfo {
bytes somebytes = 1;
}
目标
service_a
构建过程应该为两个 ( + service_b
) 实例准备必要的目标:
- 最终我们想要一些具有通用部分和
service_a
专业化(消息SpecificServiceInfo
)的语言 X 代码 - 最终我们想要一些具有通用部分和
service_b
专业化(消息SpecificServiceInfo
)的语言 X 代码
这两个输出是独立的。他们只是共享这个核心并生活在同一个存储库中。
没有巴泽尔
一个不像Bazel那样严格的简单工具链,可能只需准备2 个基本部分的先验副本到2 个隔离目录中,添加特定的实现并实例化/编译它们。
我不认为这有任何问题,除了最初的目标是在 bazel 中表达这一点,因为事情在某些时候会变得更加复杂。
尝试/问题
嗯...事实上我什至不知道从哪里开始。
我想尝试模拟上述孤立的复制方法,但我无法做到这一点。我尝试了一些宏和genrule的组合(据我了解,类似复制的方法与 genrule背后的构建时固定文件基数的想法相悖),但随着各种问题的出现,我似乎错过了一些基本概念。
核心问题似乎得到了以下两个,而不是直接连接的东西同步:
- bazel 类目标管理(例如将 base + service_a 表示为一个整体)
- 保持路径结构,以便
imports
在这些.proto
文件中工作- 特别是:
import "generic-api/specific_impl/X/specific_service_info.proto";
在service_info.proto
- 特别是:
似乎,rules_proto
旨在与WORKSPACE 相关的导入一起使用。这似乎使这变得更加困难,因为在没有相对导入的那些导入中指定service_a
vs看起来很麻烦。service_b
我不知道是否import_prefix
或strip_import_prefix
可以提供帮助。import public / exports
也可能是一种成分,但我害怕不支持 java免责声明(在 protobuf 页面上)。
有人知道如何实现这样的目标吗?是否有可能的宏/通用路径或是否需要更复杂的方法?