首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用protobuf-gradle-plugin指定Protobuf路径

如何使用protobuf-gradle-plugin指定Protobuf路径
EN

Stack Overflow用户
提问于 2021-03-25 14:18:49
回答 2查看 1.3K关注 0票数 1

我正在尝试在一个Java项目中生成Protobuf,这些Protobuf是在另一个Git存储库中定义的,我想将其添加为Git子模块。我的build.gradle包含

代码语言:javascript
复制
protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:4.0.0-rc-2"
    }
    plugins {
        grpc {
            artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
        }
    }
    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

// Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}

我已经在src/main/proto目录中包含了protobufs存储库(名为my-protobufs)。Protobuf依次位于my-protobufsproto子目录中。部分目录结构如下所示:

代码语言:javascript
复制
src/main/proto/edm-grpc-protobufs/proto
├── mypackage
│   └── v1
│       ├── bar.proto
│       └── foo.proto

foo.proto文件的import语句如下所示:

代码语言:javascript
复制
import "mypackage/v1/bar.proto";

这是因为在存储库中,Protobuf路径是proto目录。问题是,当我尝试./gradlew build时,我得到一个错误,如下所示:

代码语言:javascript
复制
> Task :generateProto FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':generateProto'.
> protoc: stdout: . stderr: mypackage/v1/bar.proto: File not found.
  my-protobufs/proto/mypackage/v1/foo.proto:5:1: Import "axmorg/v1/bar.proto" was not found or had errors.
  my-protobufs/proto/mypackage/v1/foo.proto:10:5: "SourceType" is not defined.

基本上,问题在于--proto_path (用protoc的说法)或在其中搜索导入的目录没有正确定义,因此protobuf-gradle-plugin不知道在哪里可以找到它们。是否可以更新build.gradle以指定此路径?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-18 16:13:28

我在模具文档中找到了这个:https://github.com/google/protobuf-gradle-plugin#customizing-source-directories

代码语言:javascript
复制
sourceSets {
  main {
    proto {
      // In addition to the default 'src/main/proto'
      srcDir 'src/main/protobuf'
      srcDir 'src/main/protocolbuffers'
      // In addition to the default '**/*.proto' (use with caution).
      // Using an extension other than 'proto' is NOT recommended,
      // because when proto files are published along with class files, we can
      // only tell the type of a file from its extension.
      include '**/*.protodevel'
    }
    java {
      ...
    }
  }
  test {
    proto {
      // In addition to the default 'src/test/proto'
      srcDir 'src/test/protocolbuffers'
    }
  }
}
票数 1
EN

Stack Overflow用户

发布于 2021-03-25 14:36:32

我最终解决了这个问题: Java项目实际上不需要包含相对Protobuf导入的包,而需要的包不包含相对导入,因此我将build.gradle中的sourceSets修改为

代码语言:javascript
复制
sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
        proto {
            exclude '**/*.proto'
            include 'my-protobufs/proto/mypackage/**/*.proto'
        }
    }
}

它绕过了Protobuf路径的问题,因为不再有任何导入。不过,我仍然很好奇如何指定Protobuf路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66794075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档