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

标签 gradle protocol-buffers

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

相关文章:

gradle - gradle任务构建已经存在问题

eclipse - 使用Gradle运行应用程序时,从日志消息跳至Eclipse中的行

scala - SBT 本地 Maven 存储库依赖

import - Protobuf 导入失败

node.js - gRPC Node : How to set a field that is of another Message type (with multiple types itself)

python-2.7 - Caffe 到 Tensorflow(Ethereon 的 Kaffe): TypeError: Descriptors should not be created directly,,但仅从其父级检索

android - 在Android Studio中从APK排除文件夹

android - 带有 Android Studio 的 Protobuf

java - 无法引用默认包之外的生成源类

c++ - ld.exe 找不到 Protobuf 3.4.0 的 -lprotobuf