Я пытаюсь создать плагин 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);
Однако это не выполняется для несколько причин:
- Создание расширения свойств с тем же именем («myPluginTask»), поскольку задача создает столкновение между именем задачи a nd, что приводит к исчезновению задачи с точки зрения градиента (и набрасывает наклонные ошибки, такие как «Нет такого свойства: dependsOn для класса ... MyPluginExtensions»).
- Если я предоставляю имя, которое не сталкивается с именем задачи (например, «myPluginPropExt»), метод create() работает, но НЕ добавляет расширение в собственное пространство имен, как ожидалось (например,
project.myPluginPropExt.propertyName
и вместо этого добавляет она в пространстве имен проекта (например,project.propertyName
), которая не является правильным и вызывает Gradle бросить кучу «осуждается динамическое свойство» предупреждениями.
Спасибо за первый о не добавляя расширение для выполнения этой задачи. У меня теперь есть что-то работающее, добавив расширение к объекту проекта. Однако вы неправильно поняли, что происходит с вашим вторым моментом: 'myPluginTask.sourceDir = file ('the/main/src')' является частью моего скрипта построения градиента, где я пытаюсь установить это значение расширения для конкретная сборка. –
Я понимаю, но это не так, как работают расширения. Сценарии сборки клиента настраивают свойства расширения, а не самого расширения. –
Все еще не совсем понятно: фрагмент ('myPluginTask.sourceDir = файл ('the/main/src')') - это скрипт ** client/consumer build **, который использует мой плагин и пытается установить это значение для конкретная сборка. –