我正在尝试在 Java 中创建一个具有属性扩展的 Gradle 插件(不是约定,因为这显然是旧的错误方式)。作为记录,我在 Linux 机器(Ubuntu 12.04)上使用 Gradle 1.6。
我已经弄清楚这应该在插件类定义中完成。这是一种添加扩展的方法。创建一个包含您的属性的扩展类:
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 插件中为任务添加属性扩展的正确方法是什么?
编辑:
基于其他一些 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...".
那么,再次,添加插件扩展属性的正确方法是什么?
编辑 2
所以,再试一次,我将扩展添加到项目对象,并改用 create 方法:
// 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”)会在任务名称和扩展名称之间产生冲突,导致任务从 gradle 的角度消失(并抛出倾斜错误,例如“No such property: dependsOn for类 ...MyPluginExtensions")。
- 如果我提供的名称不与任务名称冲突(例如,“myPluginPropExt”),则 create() 方法有效,但不会按预期在其自己的命名空间中添加扩展名(例如,
project.myPluginPropExt.propertyName
而是将其添加到项目中命名空间(例如,project.propertyName
)不正确并导致 Gradle 抛出一堆“不推荐使用的动态属性”警告。