当前位置: 首页 > 知识库问答 >
问题:

用gradle编译简单protobuf

雍阳
2023-03-14

如果你正在寻找GradleProtobuf项目的样本,请看这里。

我在gradle和protobuf方面遇到了困难,我想创建一个简单的gradle项目,该项目将从默认的src/main/proto、src/test/proto中获取任何proto文件,并将它们编译为src/main/java、src/test/java,然后将其打包到jar中并发布到本地repo。

不幸的是,我是gradle的新手,无法理解最初的项目是如何组成的。

这是我未完成的build.gradle档案

apply plugin: 'java'
apply plugin: "com.google.protobuf"

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.7.0'
    }
}

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.protobuf:protobuf-java:3.0.0-beta-1'
}

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            srcDir 'src/main/java'
        }
    }
    test {
        proto {
            srcDir 'src/test/proto'
        }
        proto {
            srcDir 'src/test/java'
        }
    }
}

protobuf {
    // Configure the protoc executable
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
    }
    generateProtoTasks {
        // all() returns the collection of all protoc tasks
        all().each { task ->
            // Here you can configure the task
        }

        // In addition to all(), you may get the task collection by various
        // criteria:

        // (Java only) returns tasks for a sourceSet
        ofSourceSet('main')

    }
}

运行jar任务后,我们有以下内容:

正如您所看到的,gradle将测试和主proto构建到相同的类目录(红色箭头),在jar中,我可以看到两个生成的类都包含在内(而测试应该被跳过)。

但主要问题是我想将proto文件直接编译到适当的源目录(蓝色箭头),之后普通构建会做正确的事情...毕竟我们需要src中的那些类才能在业务逻辑中使用它们...

所以我们只需要一个任务,将proto编译到相应的src目录。。。没什么了。

src/main/proto to src/main/java
src/test/proto to src/test/java

当前项目位于此处。请帮助配置这个,我很确定很多人以后会需要它。。。

共有1个答案

阴凯歌
2023-03-14

如果我没有误解你的问题,解决起来很简单。如果不想区分自己的源代码和生成的源代码,只需添加并设置generatedFileBaseDir,如下所示。generatedFilesBaseDir='src'

因此,整个构建文件如下所示:

// ...

protobuf {
// Configure the protoc executable
protoc {
    // Download from repositories
    artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
}

generateProtoTasks.generatedFilesBaseDir = 'src' // <- that line 

generateProtoTasks {
    // all() returns the collection of all protoc tasks
    all().each { task ->
        // Here you can configure the task
    }

比您的文件夹看起来更像:

  • src/main/java/com/vach/tryout/AddressBookProtos。java
  • src/main/java/com/vach/tryout/protobuf/main。爪哇

但是:这可能不是将generate与手工制作的源代码混合使用的最佳方法。因此,我的建议是将源代码生成到自己的目录中,如generatedSources,并将此目录添加到java源集中。生成文件如下所示:

sourceSets {
    main {
        proto {
            srcDir 'src/main/proto'
        }
        java {
            // include self written and generated code
            srcDirs 'src/main/java', 'generated-sources/main/java'            
        }
    }
    // remove the test configuration - at least in your example you don't have a special test proto file
}

protobuf {
    // Configure the protoc executable
    protoc {
        // Download from repositories
        artifact = 'com.google.protobuf:protoc:3.0.0-alpha-3'
    }

    generateProtoTasks.generatedFilesBaseDir = 'generated-sources'

    generateProtoTasks {
        // all() returns the collection of all protoc tasks
        all().each { task ->
            // Here you can configure the task
        }

        // In addition to all(), you may get the task collection by various
        // criteria:

        // (Java only) returns tasks for a sourceSet
        ofSourceSet('main')

    }   
}

您的目录如下所示

  • src/main/proto/dtos。协议

一个很好的副作用是您可以在git配置中忽略这个生成的源代码目录。不发布生成的源代码总是一个好主意。

 类似资料:
  • 我试图得到最基本的梯度项目(与测试)建立。我看了所有相关的问题和谷歌搜索,我似乎错过了一些非常基本的,显然不常见的东西。 我创建了一个测试类,“Gradle CompiletestJava”无法编译该文件 就这样。光秃秃的骨头!我还尝试添加 依赖关系{ testCompile'JUnit:JUnit:4.10' 有什么想法吗? 以下是我得到的:

  • 编译简单的 C 程序 C 语言经典的入门例子是 Hello World,下面是一示例代码: #include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; } 我们假定该代码存为文件‘hello.c’。要用 gcc 编译该文件,使用下面的命令: $ gcc -Wall hello.c -o hell

  • 我的项目无法使用以下库进行编译: 我的分级代码: 错误: **错误:任务“:app:PredexDebug”执行失败。 com.android.ide.common.Process.processException:org.gradle.Process.internal.execException:进程“command”/usr/lib/jvm/java-7-openjdk-amd64/bin/j

  • 我写了下面提到的一个简单的java程序。不幸的是,编译错误发生了。 在编译过程中,在命令提示符下会显示以下内容: c:\Java 它对我的任何程序都不起作用,即使是这个简单的程序也不行!这是为什么? 编辑: 现在我有: 而且它不起作用。为什么不起作用? 它说的和以前一样。 你对Java所说的。lang.String[]有效,但为什么不能呢?为什么我以前不需要穿上这些?

  • 本文向大家介绍linux下编译boost.python简单方法,包括了linux下编译boost.python简单方法的使用技巧和注意事项,需要的朋友参考一下 最近项目使用c++操作Python脚本,选用boost.python库。在window下编译安装很顺利,但是在Linux下一直编译不通过,总是提示找不到头文件。linux版本为rhel5.7。后来询问同事,原来是同事将原来系统自带的pyth

  • 我正在做从 Gradle 1.6 迁移到 2.1 的 POC 工作(基本上是为了解决这个问题:Gradle 构建/测试失败 - kryo。Kryo例外:缓冲区溢出)。 Gradle构建在Gradle 1.6上成功运行 在Gradle 2.1中,当我运行“Gradle clean build”时,会收到以下错误消息。 和 全局级别init.d/extra1...常见的gradle文件行是:我使用了相