Почему Gradle игнорирует sourceSets и / или srcDir при работе с прото-файлами? - PullRequest
0 голосов
/ 24 мая 2018

Моя структура каталогов - src / ps / proto.Мой файл build.gradle находится в каталоге src.Я установил sourceSets на

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

Тем не менее, gradlew generatePsProto дает мне множество ошибок, одна из которых заключается в том, что мой каталог с исходными файлами - src / src / ps/ прото .

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 / прото.Можно ли это сделать?Моя цель состоит в том, чтобы удалить жестко запрограммированные вызовы exec для protoc и использовать вставку protobuf для компиляции файлов * .proto в их соответствующие * .h, * .cc и, в конечном итоге, в файлы * .o.

Gradle 4.7 Время сборки: 2018-04-18 09:09:12 UTC Редакция:
b9a962bf70638332300e7f810689cb2febbd4a6c

Groovy: 2.4.12 Ant: версия Apache Ant (TM)1.9.9 скомпилировано 2 февраля 2017 г. JVM: 1.8.0_144 (Oracle Corporation 25.144-b01) ОС: 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 {}
            }
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Gradle имеет широко распространенное соглашение о том, что свойства коллекции могут быть настроены с помощью методов с одинаковыми именами.Основное различие между установкой свойства с использованием присваивания (=) и использования метода заключается в том, что последний добавляет его значения.

Таким образом, для переопределения исходного каталога по умолчанию для исходного наборавам нужно использовать присваивание:

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

Я не совсем понимаю, почему вы получаете сообщение об ошибке src / src / ps / proto , поэтому могут быть некоторые другиевопрос.Эта ошибка, похоже, исходит от protoc, а не от Gradle.

РЕДАКТИРОВАТЬ

Чтобы решить проблему с импортом, вы должны использовать

import security.proto;

т.е. без пути к исходному каталогу.Это связано с тем, что подключаемый модуль Protobuf Gradle добавляет каждый исходный каталог в качестве «включаемого каталога».protoc только выглядит в таких каталогах для импорта.

Это, по крайней мере, то, что я извлек из документации и исходного кода.

0 голосов
/ 30 мая 2018

У вас, похоже, есть опечатка для '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 в нужном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...