NestJS 集成gRPC时加载多npm包中含重复共享枚举的Proto文件出现"duplicate name"错误的解决方法问询
NestJS 集成gRPC时加载多npm包中含重复共享枚举的Proto文件出现"duplicate name"错误的解决方法问询
大家好,我最近在NestJS集成gRPC的场景下遇到了一个棘手的命名空间冲突问题,想向各位大佬请教可行的解决方案。
背景情况
我们的Protobuf定义是拆分成两个独立的npm包发布的:
@company/proto-v1:包含v1版本的API定义以及共享模型@company/proto-v2:包含v2版本的API定义以及共享模型
为了让每个包都能独立使用(自包含),两个包里都包含了一份shared_models.proto文件,里面的枚举完全一致,并且都归属在同一个命名空间com.example.shared.v1下。
遇到的问题
当我需要同时加载这两个包的Proto文件(目的是为了兼容新旧版本的客户端)时,NestJS触发了Protobuf的命名空间冲突错误,具体报错信息如下:
Error: duplicate name 'Operation' in Namespace .com.example.shared.v1
at Namespace.add (/path/to/protobufjs/src/namespace.js:239:23)
at parseEnum (/path/to/protobufjs/src/parse.js:574:16)
已尝试的方案
我试过将v2版本的共享模型命名空间修改为com.example.shared.v2,这个方法确实能解决冲突,但它破坏了语义化版本的原则——毕竟这些共享模型在逻辑上是完全相同的,仅仅因为包的版本不同就修改命名空间并不合理。
我已经做了一个最小化的复现代码来重现这个问题。
我的疑问
想请教各位,针对我们当前的包结构,有没有办法通过配置NestJS的gRPC选项来避免这个命名空间冲突问题?
内容来源于stack exchange
相关产品推荐
相关产品推荐

