You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成Java与Dart文件时Protoc需不同Proto导入路径?求解决方案

问题描述

目录结构

  • protos
    • user
      • user_service.proto
      • user_context.proto
      • user.proto

各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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:22:38