我的目录结构是src/ps/proto。我的 build.gradle 文件位于 src 目录中。我已将 sourceSets 设置为
sourceSets {
ps {
proto {
srcDir 'ps/proto'
}
}
}
然而,gradlewgeneratePsProto给了我一系列错误,其中之一是我的源目录是src/src/ps/proto。
Execution failed for task ':generatePsProto'.
> protoc: stdout: . stderr: /home/build/tree/src/src/ps/proto: warning: directory does not exist.
[libprotobuf WARNING google/protobuf/compiler/parser.cc:546] No syntax specified for the proto file: cldb.proto. Please use 'syntax = "proto2";' or 'syntax = "proto3";' to specify a syntax version. (Defaulted to proto2 syntax.)
ps/proto/security.proto: File not found.
ps/proto/common.proto: File not found.
ps/proto/cli.proto: File not found.
ps/proto/volumemirrorcommon.proto: File not found.
ps/proto/metrics.proto: File not found.
cldb.proto: Import "ps/proto/security.proto" was not found or had errors.
cldb.proto: Import "ps/proto/common.proto" was not found or had errors.
mldb.proto: Import "ps/proto/cli.proto" was not found or had errors.
mldb.proto:214:12: "CredentialsMsg" is not defined.
mldb.proto:218:12: "CredentialsMsg" is not defined.
[...]
mldb.proto:3614:12: "Key" is not defined.
mldb.proto:3618:12: "CredentialsMsg" is not defined.
mldb.proto:3619:12: "ServerKeyType" is not defined.
我不想要 Gradle 默认的 src/ps/proto。我想要 ps/原型(prototype)。这可以做到吗?我的目标是删除对 protoc 的硬编码 exec 调用,并使用 protobuf 插件将 *.proto 文件编译为各自的 *.h、*.cc,并最终编译为 *.o 文件。
Gradle 4.7 Build time: 2018-04-18 09:09:12 UTC Revision:
b9a962bf70638332300e7f810689cb2febbd4a6cGroovy: 2.4.12 Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017 JVM: 1.8.0_144 (Oracle Corporation 25.144-b01) OS: Linux 3.10.0-514.el7.x86_64 amd64
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.5'
}
}
apply plugin: 'c'
apply plugin: 'cpp'
apply plugin: 'java'
apply plugin: 'com.google.protobuf'
repositories {
mavenCentral()
}
dependencies {
compile "com.google.protobuf:protobuf-java:2.4.1"
}
sourceSets {
ps {
proto {
srcDir 'ps/proto'
}
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:2.4.1'
}
generateProtoTasks {
all().each { task ->
task.plugins {
cpp {}
}
}
}
}
最佳答案
Gradle 有一个广泛适用的约定,即集合属性可以使用同名的方法进行配置。使用赋值 (=
) 和使用方法设置属性之间的主要区别在于后者附加其值。
因此,要覆盖源集的默认源目录,您需要使用赋值:
sourceSets {
ps {
proto {
srcDirs = ['ps/proto']
}
}
}
我不太明白为什么您会收到有关 src/src/ps/proto 的错误消息,因此可能还有其他问题。该错误似乎来自 protoc
而不是 Gradle。
编辑
要解决您的导入问题,您应该使用
import security.proto;
即没有源目录路径。这是因为 Protobuf Gradle 插件似乎将每个源目录添加为“包含目录”。 protoc
仅在此类包含目录中查找导入。
这至少是我从文档和源代码中获得的信息。
关于gradle - 为什么 Gradle 在处理 proto 文件时忽略 sourceSets 和/或 srcDir?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515844/