我正在尝试用Java创建具有属性扩展名的Gradle插件(不是约定,因为这显然是旧的,错误的方式)。作为记录,我正在Linux机器(Ubuntu 12.04)上使用Gradle 1.6。
我已经弄清楚了这应该在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");
}
}
Run Code Online (Sandbox Code Playgroud)
现在,将这些扩展添加到主插件类中的项目中:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这种方法似乎并不正确。新的项目属性显示在project.ext名称空间中。我希望能够解决插件扩展为:
in my build.gradle:
myPluginTask.sourceDir = file('the/main/src')
myPluginTask.outputDir = file('the/output')
Run Code Online (Sandbox Code Playgroud)
但是,当我将此类内容放入使用我的插件的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.
Run Code Online (Sandbox Code Playgroud)
那么,在基于Java的Gradle插件中为任务添加属性扩展的正确方法是什么?
编辑:
根据其他一些SO帖子,我尝试将扩展对象添加到一个快照中:
// first attempt:
//myPluginTask.getExtensions().add("sourceDir", extensions.sourceDir);
//myPluginTask.getExtensions().add("outputDir",extensions.outputDir);
// second attempt
myPluginTask.getExtensions().add("myPluginTask", extensions);
Run Code Online (Sandbox Code Playgroud)
这似乎起作用。但是,Gradle现在抱怨我添加了一个动态属性:
Deprecated dynamic property: "sourceDir" on "task ':myPluginTask'", value: "/Users/jfer...".
Run Code Online (Sandbox Code Playgroud)
那么,再次添加插件扩展属性的正确方法是什么?
编辑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);
Run Code Online (Sandbox Code Playgroud)
但是,此操作失败有两个原因:
project.myPluginPropExt.propertyName而是将其添加到项目中)命名空间(例如project.propertyName)不正确,导致Gradle抛出一堆“不赞成使用的动态属性”警告。所以这是我的问题的解决方案:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以像这样在gradle.build文件中为扩展属性之一设置一个值(并且我没有收到有关添加已弃用的动态属性的警告):
myPluginName.sourceDir = file('the/main/src')
Run Code Online (Sandbox Code Playgroud)
最后的技巧是在我的插件任务中获取这个值:
public class MyPluginTask extends DefaultTask {
@TaskAction
public void action() {
MyPluginExtensions extensions = (MyPluginExtensions) getProject()
.getExtensions().findByName("myPluginName");
System.out.println("sourceDir value: " + extensions.sourceDir);
}
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但是这个解决方案让我烦恼的是,我希望能够将扩展属性放在与myPluginTask.sourceDir我在基于 groovy 的插件中看到的任务(例如)相同的名称空间中,但这显然不受支持或就是不行。
同时,希望这对其他人有帮助。
| 归档时间: |
|
| 查看次数: |
9426 次 |
| 最近记录: |