使用 gradle 进行简单的原型编译

2022-09-01 17:41:21

如果您正在寻找示例 gradle protobuf 项目,请看这里

我在gradle和protobuf上遇到了困难,我想创建一个简单的gradle项目,该项目将从默认值获取任何原型文件,并相应地将它们编译为,然后将其打包到jar中并发布到本地存储库。src/main/protosrc/test/protosrc/main/javasrc/test/java

不幸的是,我是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任务后,我们有这个:

enter image description here

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

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

所以我们只需要一个任务,将proto编译到适当的src目录...而已。

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

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


答案 1

如果我没有误解你的问题,那就很容易解决。如果您不想区分自己的源和生成的源,则只需添加设置生成的FileBaseDir,如下所示generateProtoTasks.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.java

但:这可能不是将生成与手工制作的源代码混合在一起的最佳主意。所以我的建议是将源代码生成到一个自己的目录中,如generationSources,并将此目录添加到java sourceSet中。构建文件将如下所示:

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.proto
  • src/main/java/com/vach/tryout/protobuf/Main.java
  • generated-sources/main/java/com/vach/tryout/AddressBookProtos.java

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


答案 2

推荐