微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用Java定义Gradle插件属性扩展的正确方法?

我正在尝试在Java中创建一个具有属性扩展的Gradle插件(不是约定,因为这显然是old,wrong方式).为了记录,我在Linux机器上使用Gradle 1.6(Ubuntu 12.04).

我已经知道这应该在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插件中为任务添加属性扩展的正确方法是什么?

编辑:

基于其他一些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 class … MyPluginExtensions“).
>如果我提供的名称不与任务名称冲突(例如,“myPluginPropExt”),则create()方法可以正常工作,但不要按预期在自己的命名空间中添加扩展名(例如,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);
    }
}

现在我可以像我这样在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);
    }
}

这是有效的,但令我烦恼的是这个解决方案是我希望能够将扩展属性放在与我在基于groovy的插件中看到的任务(例如,myPluginTask.sourceDir)相同的命名空间中,但这显然是不支持或只是不工作.

在此期间,希望这有助于其他人.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐