当前位置: 首页 > 知识库问答 >
问题:

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

巴洲
2023-03-14

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

sourceSets {
    ps {
        proto {
             srcDir 'ps/proto'
        }
    }
}

然而,gradlew generatePsProto给了我一系列错误,其中之一是我的源目录是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.

我不想要src/ps/proto的Gradle默认值。我想要PS/Proto。这能做到吗?我的目标是删除对protoc的硬编码exec调用,并使用protobuf插件将*.proto文件编译为各自的*.h、*.cc,最终编译为*.o文件。

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 {}
            }
        }
    }
}

共有1个答案

汝弘深
2023-03-14

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

因此,要重写源集的默认源目录,需要使用赋值:

sourceSets {
    ps {
        proto {
            srcDirs = ['ps/proto']
        }
    }
}

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

import security.proto;
 类似资料:
  • 见下图。我的.gitignore文件应该忽略src/dist中的所有文件,但事实并非如此。

  • 我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束

  • 注:据我所知,该问题不是以下问题的重复问题: HTML5:为什么我的“oninvalid”属性让模式失败 HTML5表单必需属性。设置自定义验证消息 如何更改或删除HTML5表单验证默认错误消息 给定一个字段: 为验证设置了属性,例如对于4个字符的十六进制字符串输入设置了 下面是一个示例,说明了这一点: 验证工作几乎与预期一样,除非用户输入无效条目,然后继续尝试并编辑它,其以下输入状态仍然无效:

  • 问题内容: 我有责任将我们的代码从sqlite切换到postgres。我遇到麻烦的查询之一复制到下面。 当有重复的记录时,就会出现此问题。在此表中,两个值的组合必须唯一。我在其他地方使用了一些plpgsql函数来执行更新或插入操作,但是在这种情况下,我可以一次执行多个插入操作。我不确定如何为此编写存储的例程。感谢您提供的所有sql专家的所有帮助! 问题答案: 有 3个 挑战。 您的查询在表和之间没

  • 问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类

  • 问题内容: 与这两个帖子@iMohammad有关, 在单击JButtonJava时使用JButton增加/减少textArea内的字体大小并在单击JButton Java时更改字体样式 …,我面临着一个非常有趣的问题,该问题来自于on 作为参数传递屏幕 请如何动态调整大小取决于,与我在sscce中尝试过的另一个JComponent正常工作一样 问题答案: 我调试了您的SSCCE,并且传递给的值为空