Gradle плагин для XML Beans

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

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

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

Спасибо! 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 / Groovy 2.3.10 / JVM 7u55 на Windows 7 AMD64

1 ответ

Решение

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

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

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

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

Другие вопросы по тегам