2015-07-22 2 views
0

Я пытаюсь написать плагин Gradle для XML Beans. Я начал с одного из примеров плагина «Hello from Gradle», а также плагина, опубликованного R. Artavia here. Этот плагин пошел прямо в банку - я пытаюсь только генерировать источник. Сгенерированный источник затем должен быть скомпилирован с другим источником проекта и включен в одну банку. Другие цели включают - полный плагин - все, что мне нужно, это «применить плагин:« xmlbean »» - Я могу настроить местоположение исходного кода/кода и некоторые функции, если хочу - Он определяет, нужно ли его перестраивать. (ну, в конце концов !!!)Плагин Gradle для XML Beans

Я добрался до неплохого начала, но заблокировал определение нового источника. Я получаю сообщение об ошибке «Нет такого свойства« srcDirs »(или« srcDir »). Кажется, есть кое-что, что я должен определить где-нибудь, чтобы сделать новую работу sourceSet, но я не могу ее найти. Я пробовал несколько разных синтаксисов (с/без знака равенства, скобки, srcDir/srcDirs и т. Д. - ничего не работает ...

Что нужно сделать внутри плагина, чтобы новая запись источника была правильно распознана ?

Спасибо JKE

Файл: xmlbean.gradle (включает в себя приветственное плагин на данный момент для отладки)

apply plugin: xmlbean 
apply plugin: 'java' 

xmlbean { 
    message = 'Hi' 
    greeter = 'Gradle' 
} 

class xmlbean implements Plugin<Project> { 

    void apply(Project project) { 

    project.extensions.create("xmlbean", xmlbeanExtension) 
    Task xmlbeanTask = project.task('xmlbean') 
    xmlbeanTask << { 

     project.configurations { 
     xmlbeans 
     } 

     project.dependencies { 
     xmlbeans 'org.apache.xmlbeans:xmlbeans:2.5.0' 
     } 

     project.sourceSets { 
     main { 
      java { 
      srcDirs += '$project.buildDir/generated-source/xmlbeans' 
      } 
     } 
     xmlbeans { 
      srcDirs = ['src/main/xsd'] 
     } 
     } 

     ant.taskdef(name: 'xmlbean', 
        classname: 'org.apache.xmlbeans.impl.tool.XMLBean', 
        classpath: project.configurations.xmlbeans.asPath) 
     ant.xmlbean(schema: project.sourceSets.xmlbean.srcDir, 
        srconly: true, 
        srcgendir: "$project.buildDir/generated-sources/xmlbeans", 
        classpath: project.configurations.xmlbeans.asPath) 

     println "${project.xmlbean.message} from ${project.xmlbean.greeter}" 
    } 
    project.compileJava.dependsOn(xmlbeanTask) 
    } 
} 

class xmlbeanExtension { 
    String message 
    String greeter 
} 

Файл: build.gradle

apply from: '../gradle/xmlbeans.gradle' 

dependencies { 
    compile "xalan:xalan:$ver_xalan", 
      ":viz-common:0.0.1", 
      ":uform-repository:0.1.0" 
} 

консоли: Сообщение об ошибке:

:idk:xmlbean FAILED 

FAILURE: Build failed with an exception. 

* Where: 
Script 'C:\jdev\cpc-maven\try.g2\comotion\gradle\xmlbeans.gradle' line: 32 

* What went wrong: 
Execution failed for task ':idk:xmlbean'. 
> No such property: srcDirs for class: org.gradle.api.internal.tasks.DefaultSourceSet_Decorated 
... 
BUILD FAILED 

Информация Gradle: версия 2.5/заводной 2.3.10/JVM 7u55 на Windows 7 AMD64

ответ

3

Вы должны попытаться ознакомиться с DSL ссылкой Gradle потому что это огромная помощь в подобных ситуациях. Например, если вы нажмете на ссылку sourceSets { } в левой панели навигации, вы попадете на this section на исходные наборы.

Оттуда вы обнаружите, что блок sourceSets {} поддерживается классом, SourceSetContainer. Следующий уровень конфигурации, вложенный внутри, поддерживается объектом SourceSet, а затем внутри него имеется одна или несколько конфигураций SourceDirectorySet. Когда вы перейдете по ссылке SourceDirectorySet, вы увидите, что есть методы getSrcDirs() и setSrcDirs().

Как это помогает? Если вы посмотрите внимательно на исключение, вы увидите, что Gradle говорит, что он не может найти свойство srcDirs на DefaultSourceSet_Decorated, что, можно надеяться, является экземпляром SourceSet. Этот интерфейс делает не имеет srcDirs собственности. Это потому, что ваш блок xmlbeans {} настраивает SourceSet, а не SourceDirectorySet. Вам нужно добавить еще одну вложенную конфигурацию, чтобы получить доступ к srcDirs.

На данный момент мне интересно, является ли новый набор источников подходящим решением. К сожалению, мне не совсем ясно, что должен делать плагин, поэтому я не могу предложить альтернативы на данный момент.

+0

Спасибо @ peter-ledbrook - как-то я не видел его на следующий день. Руководство порядочно, но groovy является новым для меня, и есть вещи, которые я еще не вижу; так как временный обходной путь я просто закодировал строку в блок конфигурации и передал ее в инструмент XMLBean. Я думаю, что вы говорите мне - в терминах «новичка», это то, что мне нужно переместить блок «xmlbeans {}» из того, что он является родным «главным» для одного из братьев «java» внутри основного или по крайней мере, где-то «глубоко». Я пробовал оба, но получил ошибки в обоих направлениях. –

+0

Похоже, что иногда обозначения определяют что-то с новыми полями или локальными переменными/свойствами, а иногда поля уже существуют, и я не понял, когда применяются каждая из этих ситуаций. –

+0

'main' - это часть, которую вы можете заменить. Таким образом, вы бы выбрали 'sourceSets {xmlbeans {java {srcDirs =" ... "}}}'. Однако, если он не содержит источник Java, я не думаю, что вы должны создать исходный набор вообще. –