生成Java与Dart文件时Protoc需不同Proto导入路径?求解决方案
问题描述
目录结构
- protos
- user
- user_service.proto
- user_context.proto
- user.proto
- user
各Proto文件内容
user_service.proto
package com.project.protos.user; import "protos/user/user.proto"; import "protos/user/user_context.proto"; service UserService { rpc GetUser(UserContext) returns (User); }
user_context.proto
package com.project.protos.user; message UserContext { string token = 1; }
遇到的问题
用当前导入路径时,执行Java生成命令:
protoc --java_out=services/src/main/java protos\user\user_service.proto
能正常生成Java文件,但执行Dart生成命令:
protoc --dart_out=grpc:project/lib/protos -Iprotos protos/user/user_service.proto
会报找不到导入文件的错误。
现在只有把导入路径改成user/user.proto(删掉顶层protos/目录)才能生成Dart文件,但这样Java生成又会失败。频繁改导入路径太折腾,求其他解决办法?
解决方案
方案1:统一导入路径,给Java命令加根路径参数
既然Dart需要用相对protos根目录的短路径(user/user.proto),那调整Java的protoc命令,加上-Iprotos参数,让Java端也能识别这种短路径导入。
修改后的Java生成命令:
protoc --java_out=services/src/main/java -Iprotos protos/user/user_service.proto
之后把所有proto文件里的导入路径改成user/user.proto和user/user_context.proto,这样Java和Dart的命令都能正常跑,不用再改导入路径。
方案2:调整Dart命令的根路径,适配现有导入
如果不想改现有proto的导入路径,直接把Dart命令里的-Iprotos改成-I.(把当前目录作为protoc的根路径),这样protoc会从当前目录开始查找protos/user/user.proto,就能匹配到文件了,原导入路径不用动,Java命令也能继续正常用。
修改后的Dart生成命令:
protoc --dart_out=grpc:project/lib/protos -I. protos/user/user_service.proto
方案3:用脚本统一管理生成命令
嫌手动敲命令麻烦的话,可以写个简单脚本(bash或批处理),分别处理Java和Dart的生成逻辑,不用手动改导入路径。比如:
示例bash脚本(gen_protos.sh)
#!/bin/bash # 生成Java文件 protoc --java_out=services/src/main/java protos/user/user_service.proto # 生成Dart文件(用方案2的命令) protoc --dart_out=grpc:project/lib/protos -I. protos/user/user_service.proto
内容的提问来源于stack exchange,提问作者toast
相关产品推荐
相关产品推荐

