将额外属性传递给gradle任务的问题

时间:2017-04-08 00:30:27

标签: gradle groovy

我无法将额外的属性传递给gradle任务。这是我的构建文件

buildscript {
    repositories {
}


ext {
    dir = ''
}

apply plugin: 'java'
apply plugin: 'maven'
apply plugin: 'groovy'

group = 'group'
version = 'version'

sourceCompatibility = 1.8
targetCompatibility = 1.8

task wrapper(type: Wrapper) {
    gradleVersion = '3.4'
}

repositories {

}
dependencies {
    compile gradleApi()
    compile localGroovy()

}

正如你所看到的,我有一个额外的属性,因为dir被初始化为''。现在,这是我的任务

class MyTask extends DefaultTask {
    File myDir = project.dir

    @TaskAction
    public void action() {
    }
}

我的插件

class MyPlugin implements Plugin<Project> {
    @Override
    def void apply(Project project) {
        project.tasks.create("myTask", MyTask)
    }

}

这个单元测试

public class TestPlugin {
    @Test
    public void testPlugin() {
        Project project = ProjectBuilder.builder().build();
        project.getPlugins().apply(TestPlugin.class);
        Assert.assertTrue(project.getProject().getTasks().findByName("myTask") instanceof MyTask);
    }
}

现在,当我运行测试时,它会显示无法找到dir属性的错误。

Caused by: groovy.lang.MissingPropertyException 

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

您的build.gradle脚本和测试没有任何关联。在您的测试中,您创建一个干净的新项目,您要做的第一件事(也是唯一的)是应用您的自定义插件,然后创建您的自定义任务。将设置任务属性myDir,但项目中不存在被调用的属性dir,因此抛出异常。

您可以为测试项目定义额外属性dir ...

Project project = ProjectBuilder.builder().build();
project.ext.dir = ''
project.getPlugins().apply(TestPlugin.class);
Assert.assertTrue(project.getProject().getTasks().findByName("myTask") instanceof MyTask);

...或将您的新插件应用到build.gradle脚本的项目中(完成后)。