protobufjs 命令执行_gulp-protobufjs 踩坑记

protobuf对于后台开发来说应该是在熟悉不过了,google定义的协议。这次我们要拿它在前端干点事,它定义了后台的数据结构,那么如果前后台的数据是一一对应的,protobuf就能为前端所用。尤其是在前后台同时开发的时候。通过gulp-protobufjs来解析protobuf文件,生成对应的JSON文件。

在使用的过程中,刚开始一切都很顺利,直到遇到了这个错误:

Error (gulp-protobufjs): cannot determine import root

这个错误让人一脸懵逼啊,字面意思是import依赖出错。后来检索到关键字出打log,发现依赖google/protobuf/descriptor.proto的时候这个错误就出现了,其他情况相当的正常。

gulp-protobufjs这个gulp插件最终是依赖了protobuf.js这个来处理,核心逻辑全在这里面。在他的issues里面找到一个差不多的错误,依赖没有解决的思路。根据google/protobuf关键字搜索到这个项目的readme。事情终于出现了转机:

Though it’s possible to include them:

You may explicitly reference them by providing a relative or absolute path in your .proto files. E.g. use ./google/protobuf/descriptor.proto and bundle the file with your application.

If you use the proto2js command line utility with the -legacy option and the descriptor namespace is explicitly referenced, it is included in the generated output.

readme 里面说的意思是说,默认是没有把google/protobuf/descriptor.proto解析进来,但提供了两种方式把他加进去。一直是写相对或者绝对路径,而是通过legacy配置。

通过阅读源码:node_modules/protobufjs/cli/pbjs.js,发现处理legacy命令的地方,他的描述也确实如此。那么他实际对应的就是options。

legacy: {

alias: "l",

describe: "Includes legacy descriptors from google/protobuf/ if\nexplicitly referenced.",

default: false

},

剩下的问题就是在配置项加上这个。有点坑爹的是,gulp-protobufjs插件把这个配置项堵死了,对外的接口压根没有设置这个参数的。无奈之下,只能去修改他的源文件了node_modules/gulp-protobufjs/options.js

options = {

encoding: encoding,

input: input,

target: target,

path: options.path,

ext: extension,

noErrorReporting: noErrorReporting,

showStack: showStack,

legacy: true // 这里增加一个参数

};

对应源文件的42行,加上此就能愉快的转换了。后面再介绍整体的pb2json整体的流程。发现这个还是挺有用,除了mock后台返回的数据,在做前端页面适配,xss测试等等都能够有很大的用处,前端可以变得更加自动化,节省人力,提高效率。

想要打赏?你的鼓励是我前进的动力!

6dc4d588c2789442e62f23f6667cadcf.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值