gpt4 book ai didi

gradle - 为什么 Gradle 在处理 proto 文件时忽略 sourceSets 和/或 srcDir?

转载 作者:行者123 更新时间:2023-12-02 11:32:03 24 4
gpt4 key购买 nike

我的目录结构是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:
b9a962bf70638332300e7f810689cb2febbd4a6c

Groovy: 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com