首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Gradle在处理原始文件时会忽略sourceSets和/或srcDir?

为什么Gradle在处理原始文件时会忽略sourceSets和/或srcDir?
EN

Stack Overflow用户
提问于 2018-05-25 02:24:35
回答 2查看 1.5K关注 0票数 9

我的目录结构是src/ps/proto。我的build.gradle文件位于src目录中。我已将sourceSets设置为

代码语言:javascript
复制
sourceSets {
    ps {
        proto {
             srcDir 'ps/proto'
        }
    }
}

然而,gradlew generatePsProto给了我一系列错误,其中之一是我的源目录是gradlew

代码语言:javascript
复制
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

代码语言:javascript
复制
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 {}
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 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/中,然后添加

代码语言:javascript
复制
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文件。

票数 0
EN

Stack Overflow用户

发布于 2018-05-31 21:15:05

Gradle有一个广泛适用的约定,即可以使用相同名称的方法配置集合属性。使用赋值(=)设置属性和使用方法设置属性之间的关键区别在于,后者会追加其值。

因此,要覆盖源集的默认源目录,您需要使用赋值:

代码语言:javascript
复制
sourceSets {
    ps {
        proto {
            srcDirs = ['ps/proto']
        }
    }
}

我真的不明白为什么你会收到一条关于src/src/ps/proto的错误消息,所以可能还有其他的问题。这个错误似乎来自protoc,而不是Gradle。

编辑

要解决导入问题,您应该使用

代码语言:javascript
复制
import security.proto;

即没有源目录路径。这是因为Protobuf Gradle插件似乎将每个源目录添加为“包含目录”。protoc只在这样的包含目录中查找导入。

这至少是我从文档和源代码中获得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50515844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档