使用 gradle 进行简单的 protobuf 编译
simple protobuf compilation with gradle
如果您正在寻找示例 gradle protobuf 项目,请查看 here。
我在使用 gradle 和 protobuf 时遇到了困难,
我想创建一个简单的 gradle 项目,它将从默认的 src/main/proto
、src/test/proto
中获取任何原型文件,并将它们相应地编译为 src/main/java
、src/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 任务后我们有这个:
如您所见,gradle 将测试和主要原型构建到相同的 类 目录(红色箭头),在 jar 中我可以看到生成的 类 都包含在内(而应跳过测试)。
但主要问题是我想将原型文件直接编译到适当的源目录(蓝色箭头),之后普通构建将做正确的事情......毕竟我们需要 src 中的那些 类 才能在业务逻辑中使用它们...
所以我们只需要一个将 proto 编译到适当的 src 目录的任务...仅此而已。
src/main/proto to src/main/java
src/test/proto to src/test/java
当前项目原样位于 here。请帮助配置这个,我很确定很多人以后会需要它...
如果我没有误解你的问题,解决起来很简单。如果您不想区分您自己的源和生成的源,您只需像这样添加设置 generatedFileBaseDir 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
但是:
将生成与手工制作的源代码混合使用可能不是最好的主意。所以我的建议是将源代码生成到一个自己的目录中,例如 generatedSources 并将此目录添加到 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 配置中忽略此 generated-sources 目录。最好不要发布生成的源代码。
如果您正在寻找示例 gradle protobuf 项目,请查看 here。
我在使用 gradle 和 protobuf 时遇到了困难,
我想创建一个简单的 gradle 项目,它将从默认的 src/main/proto
、src/test/proto
中获取任何原型文件,并将它们相应地编译为 src/main/java
、src/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 任务后我们有这个:
如您所见,gradle 将测试和主要原型构建到相同的 类 目录(红色箭头),在 jar 中我可以看到生成的 类 都包含在内(而应跳过测试)。
但主要问题是我想将原型文件直接编译到适当的源目录(蓝色箭头),之后普通构建将做正确的事情......毕竟我们需要 src 中的那些 类 才能在业务逻辑中使用它们...
所以我们只需要一个将 proto 编译到适当的 src 目录的任务...仅此而已。
src/main/proto to src/main/java
src/test/proto to src/test/java
当前项目原样位于 here。请帮助配置这个,我很确定很多人以后会需要它...
如果我没有误解你的问题,解决起来很简单。如果您不想区分您自己的源和生成的源,您只需像这样添加设置 generatedFileBaseDir 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
但是: 将生成与手工制作的源代码混合使用可能不是最好的主意。所以我的建议是将源代码生成到一个自己的目录中,例如 generatedSources 并将此目录添加到 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 配置中忽略此 generated-sources 目录。最好不要发布生成的源代码。