android grpc 示例应用程序中的 protobuf 生成名为 "nano" 的额外包层次结构

protobuf in the android grpc sample app generating extra package heirarchy called "nano"

我正在尝试为 grpc 构建示例 android 应用程序。

hello_world.proto文件如下:

syntax = "proto3";

package helloworld;

option java_multiple_files = true;
option java_package = "io.github.caio.grpc";
option java_outer_classname = "HelloWorldProto";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloResponse) {}
  rpc GetData (HelloRequest) returns (HelloResponse) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloResponse {
  string message = 1;
}

gradle个文件如下

应用级别gradle:

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.example.grpctest.grpcandroidapp"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0-beta-2'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:0.12.0' // CURRENT_GRPC_VERSION
        }
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins {
                javanano {
                    // Options added to --javanano_out
                    option 'ignore_services=true'
                }
            }

            task.plugins {
                grpc {
                    // Options added to --grpc_out
                    option 'nano'
                }
            }

            task.plugins {
                grpc {
                    // Write the generated files under
                    // "$generatedFilesBaseDir/$sourceSet/grpcjava"
                    outputSubDir = ''
                }
            }
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile 'com.android.support:design:23.1.1'
    compile 'io.grpc:grpc-okhttp:0.12.0' // CURRENT_GRPC_VERSION
    compile 'io.grpc:grpc-protobuf-nano:0.12.0' // CURRENT_GRPC_VERSION
    compile 'io.grpc:grpc-stub:0.12.0' // CURRENT_GRPC_VERSION
    compile 'javax.annotation:javax.annotation-api:1.2'
}

项目级别gradle:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath "com.google.protobuf:protobuf-gradle-plugin:0.7.4"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

有了这个.proto文件,我们应该得到生成的Java个文件的包结构如下:

io->grpc->examples->helloworld

但是生成的 HelloRequest 和 HelloResponse 文件在以下包结构中:

io->grpc->examples->helloworld->nano

但是 GreeterGrpc.java 文件是在正确的包结构中生成的。

GreeterGrpc 中的 "HelloRequest" 和 "HelloResposne" 导入引用 io.grpc.examples.helloworld 包,因此编译失败。

请让我知道这个问题的解决方案。

grpc-java 0.13 及更早版本需要使用 option 'nano=true'。 grpc-java 0.14 将另外支持option 'nano'