首页 > 解决方案 > 默认在gradle中为proto文件生成的类注册一个包,而不是在proto文件中

问题描述

在我的 android 应用程序中,我使用 proto 文件。例如,我有原始文件 Stats.proto

syntax = "proto3";
package com.me.test;

message Stat {
    string a = 1;
    string b = 2;
    string c = 3;
    string d = 4;
}

我需要在每个 proto 文件本身中注册包,这很不舒服,因为我有很多文件。我想在 gradle 中注册默认包,例如“package com.me.test”,它使用我创建的每个文件。我在 javanano 中找到了解决方案

nano {
    proto {
      // Selects between --java_out and --javanano_out, default is 'java'
      mode 'javanano'
      // Options added to --java_out or --javanano_out
      option 'java_package=src/proto/simple-data.proto|my_package'
      option 'java_outer_classname=src/proto/simple-data.proto|OuterName'
      // Apply the 'grpc' plugin defined in protobufNativeCodeGenPluginDeps
      plugin 'grpc' {
        // Options added to --grpc_out
        option 'nano=true'
      }
    }

但我需要使用 javalite

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.plugins {
                javalite { }
            }
        }
    }
}

我想有类似的逻辑

option 'java_package=src/proto/simple-data.proto|my_package'

像 javalite 中的 javanano

我可以实施吗?

标签: androidgradleprotocol-buffers

解决方案


根据文档,并假设javalite支持相同的功能java(这是一个很长的镜头,因为我没有在这个插件上找到任何文档痕迹),试一试:

protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.0.0'
    }
    plugins {
        javalite {
            artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.builtins {
                remove java
            }
            task.plugins {
                javalite {
                    option 'java_package=.......'                 
                }
            }
        }
    }
}

编辑:尝试以检查对象:

task.plugins {
    javalite {
        it.properties.each { println "$it.key -> $it.value" }
    }
}

推荐阅读