0

语境

我正在尝试在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_avs看起来很麻烦。service_b

我不知道是否import_prefixstrip_import_prefix可以提供帮助。import public / exports也可能是一种成分,但我害怕不支持 java免责声明(在 protobuf 页面上)。

有人知道如何实现这样的目标吗?是否有可能的宏/通用路径或是否需要更复杂的方法?

4

0 回答 0