2013-08-26 2 views
4

Я пытаюсь создать плагин Gradle на Java, который имеет расширения свойств (не условные обозначения, поскольку это, по-видимому, путь old, wrong). Для записи я работаю с Gradle 1.6 на Linux-машине (Ubuntu 12.04).Правильный способ определения расширения свойств плагина Gradle с помощью Java?

Я догадался, что это должно быть сделано в определении класса Plugin. Вот способ добавления расширения. Создание класса расширения, который содержит свои свойства:

public class MyPluginExtensions { 

    File sourceDir; 
    File outputDir; 

    public MyPluginExtensions(Project project) { 
     this.project = project; 
     sourceDir = new File(project.getProjectDir(), "src"); 
     outputDir = new File(project.getBuildDir(), "out"); 
    } 

} 

Теперь добавьте эти расширения к проекту в главном классе плагина:

public class MyPlugin implements Plugin<Project> { 

    @Override 
    public void apply(Project project) { 

     Map<String,Object> taskInfo = new HashMap<String,Object>(); 
     taskInfo.put("type", MyPluginTask.class); 
     taskInfo.put("description", "Generates blah from blah."); 
     taskInfo.put("group", "Blah"); 
     Task myPluginTask = project.task(taskInfo, "myPluginTask"); 

     // Define conventions and attach them to tasks 
     MyPluginExtensions extensions = new MyPluginExtensions(project); 
     myPluginTask.getExtensions().add(
       "sourceDir", 
       extensions.sourceDir); 
     myPluginTask.getExtensions().add(
       "outputDir", 
       extensions.outputDir); 
    } 
} 

Этот подход, однако, не кажется правильным. Новое свойство проекта отображается в пространстве имен project.ext. Я ожидаю, чтобы иметь возможность обратиться расширения плагина как:

in my build.gradle: 
myPluginTask.sourceDir = file('the/main/src') 
myPluginTask.outputDir = file('the/output') 

Однако, когда я ставлю такие вещи в Gradle скрипт, который использует свой плагин и попытаться установить это свойство, Gradle говорит мне, что я не могу установить его :

* What went wrong: 
A problem occurred evaluating script. 
> There's an extension registered with name 'sourceDir'. You should not reassign it via a property setter. 

Итак, что это правильный путь, чтобы добавить расширения свойств для задачи в Java на основе Gradle плагин?

EDIT:

на основе некоторых других SO сообщений, я попытался просто добавить мои расширения объекта в одном кадре:

// first attempt: 
//myPluginTask.getExtensions().add("sourceDir", extensions.sourceDir); 
//myPluginTask.getExtensions().add("outputDir",extensions.outputDir); 

// second attempt 
myPluginTask.getExtensions().add("myPluginTask", extensions); 

Это, кажется, работает. Однако Gradle теперь жалуются, что я добавил динамическое свойство:

Deprecated dynamic property: "sourceDir" on "task ':myPluginTask'", value: "/Users/jfer...". 

Итак, опять же, что это правильный путь, чтобы добавить свойство расширения плагин?

EDIT 2

Таким образом, принимая еще один выстрел в это, я добавляю расширение к объекту проекта и с помощью метода создания вместо:

// first attempt: 
//myPluginTask.getExtensions().add("sourceDir", extensions.sourceDir); 
//myPluginTask.getExtensions().add("outputDir",extensions.outputDir); 

// second attempt 
// myPluginTask.getExtensions().add("myPluginTask", extensions); 

// third attempt 
project.getExtensions().create("myPluginTask", MyPluginExtensions.class, project); 

Однако это не выполняется для несколько причин:

  1. Создание расширения свойств с тем же именем («myPluginTask»), поскольку задача создает столкновение между именем задачи a nd, что приводит к исчезновению задачи с точки зрения градиента (и набрасывает наклонные ошибки, такие как «Нет такого свойства: dependsOn для класса ... MyPluginExtensions»).
  2. Если я предоставляю имя, которое не сталкивается с именем задачи (например, «myPluginPropExt»), метод create() работает, но НЕ добавляет расширение в собственное пространство имен, как ожидалось (например, project.myPluginPropExt.propertyName и вместо этого добавляет она в пространстве имен проекта (например, project.propertyName), которая не является правильным и вызывает Gradle бросить кучу «осуждается динамическое свойство» предупреждениями.

ответ

3

Так вот решение моей проблемы:

public class MyPlugin implements Plugin<Project> { 

    @Override 
    public void apply(Project project) { 

     Map<String,Object> taskInfo = new HashMap<String,Object>(); 
     taskInfo.put("type", MyPluginTask.class); 
     taskInfo.put("description", "Generates blah from blah."); 
     taskInfo.put("group", "Blah"); 
     Task myPluginTask = project.task(taskInfo, "myPluginTask"); 

     // Define conventions and attach them to tasks 
     MyPluginExtensions extensions = new MyPluginExtensions(project); 

     // the magic extension code: 
     project.getExtensions().add("myPluginName", extensions); 
    } 
} 

Теперь я могу установить значение для одного из свойств расширений в моем gradle.build файл как так (и я не получить предупреждение о добавлении устаревших динамических свойств):

myPluginName.sourceDir = file('the/main/src') 

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

public class MyPluginTask extends DefaultTask { 
    @TaskAction 
    public void action() { 
     MyPluginExtensions extensions = (MyPluginExtensions) getProject() 
       .getExtensions().findByName("myPluginName"); 

     System.out.println("sourceDir value: " + extensions.sourceDir); 
    } 
} 

Это работает, но то, что раздражает меня об этом решении является то, что я хочу, чтобы иметь возможность поставить свойство расширения в том же пространстве имен, как задача (например, myPluginTask.sourceDir), который я видел в заводных основе плагин, но это, по-видимому, не поддерживается или просто не работает.

В то же время надеюсь, что это поможет кому-то еще.

0

код добавления расширения к задаче (а не проект) , что редко бывает полезным.После этого он пытается установить myPluginTask.sourceDir = file('the/main/src'), что невозможно, потому что расширение было просто зарегистрировано под тем же именем.

+0

Спасибо за первый о не добавляя расширение для выполнения этой задачи. У меня теперь есть что-то работающее, добавив расширение к объекту проекта. Однако вы неправильно поняли, что происходит с вашим вторым моментом: 'myPluginTask.sourceDir = file ('the/main/src')' является частью моего скрипта построения градиента, где я пытаюсь установить это значение расширения для конкретная сборка. –

+0

Я понимаю, но это не так, как работают расширения. Сценарии сборки клиента настраивают свойства расширения, а не самого расширения. –

+0

Все еще не совсем понятно: фрагмент ('myPluginTask.sourceDir = файл ('the/main/src')') - это скрипт ** client/consumer build **, который использует мой плагин и пытается установить это значение для конкретная сборка. –

0

Когда ваша задача и ваше расширение имеют такое же имя, вы можете сделать это в вашем build.gradle:

myPluginTask.sourceDir = file('the/main/src') 
project.tasks.myPluginTask.dependsOn clean 
Смежные вопросы