我的目录结构是src/ps/proto。我的build.gradle文件位于src目录中。我已将sourceSets设置为
sourceSets {
ps {
proto {
srcDir 'ps/proto'
}
}
}然而,gradlew generatePsProto给了我一系列错误,其中之一是我的源目录是gradlew
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/proto。这可以做到吗?我的目标是删除对protoc的硬编码exec调用,并使用protobuf插件将*.proto文件编译成各自的*.h、*.cc,最终编译成*.o文件。
版本4.7构建时间: 2018-04-18 09:09:12
b9a962bf70638332300e7f810689cb2febbd4a6c
Groovy: 2.4.12 Ant: Apache Ant(TM) version 1.9.9编译于2017年2月2日JVM: 1.8.0_144 (甲骨文公司25.144-b01)操作系统:Linux3.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 {}
}
}
}
}发布于 2018-05-31 02:21:41
你似乎有'fs‘或'ps’的打字错误。
问题出在导入。因为你有一个例子
cldb.proto:导入"ps/proto/security.proto“
mldb.proto:导入"ps/proto/cli.proto“
编辑:
您必须将每个.proto文件放入src/yourCustomSourceSetName/proto/ps/proto/中,然后添加
sourceSets {
yourCustomSourceSetName {}
}
dependencies {
compile ... // dependencies for compileJava task
yourCustomSourceSetNameCompile ... // dependencies for custom sourceSet
compile sourceSets.yourCustomSourceSetName.output // compileJava uses output of the custom sourceSet
}然后,导入将在正确的位置查找其他.proto文件。
发布于 2018-05-31 21:15:05
Gradle有一个广泛适用的约定,即可以使用相同名称的方法配置集合属性。使用赋值(=)设置属性和使用方法设置属性之间的关键区别在于,后者会追加其值。
因此,要覆盖源集的默认源目录,您需要使用赋值:
sourceSets {
ps {
proto {
srcDirs = ['ps/proto']
}
}
}我真的不明白为什么你会收到一条关于src/src/ps/proto的错误消息,所以可能还有其他的问题。这个错误似乎来自protoc,而不是Gradle。
编辑
要解决导入问题,您应该使用
import security.proto;即没有源目录路径。这是因为Protobuf Gradle插件似乎将每个源目录添加为“包含目录”。protoc只在这样的包含目录中查找导入。
这至少是我从文档和源代码中获得的。
https://stackoverflow.com/questions/50515844
复制相似问题