gradle从扩展中获取值(作为输入传递给任务)

时间:2014-05-30 19:30:48

标签: plugins gradle

我的插件中有以下代码:

    @Override
    void apply(Project project) {

        project.extensions.create(EXTENSION,TestExtension)

        project.task("task1") << {
            println "Task 1"
            println(project.mmm.test)
            def extension = project.extensions.findByName(EXTENSION)
            println(extension.test)
        }

        project.task("task2",type: TestTask) {
            println "Task 2 "
            def extension = project.extensions.findByName(EXTENSION)
//            conventionMapping.test = {extension.test}
//            println(project.extensions.findByName(EXTENSION).test)
//            test = "test"

        }
    }

在任务1中,extension.test返回正确的值。但是在task2 extension.test中总是返回null。我做错了什么?有没有更好的方法将一些扩展值作为任务的输入传递?我在Mac上使用gradle 1.12和jdk 1.8。最诚挚的问候

编辑:正确的版本:

   project.task("task2", type: TestTask) {
        project.afterEvaluate {
            def extension = project.extensions.findByName(EXTENSION)
            println(project.extensions.findByName(EXTENSION).test)
            test = project.extensions.findByName(EXTENSION).test
        }
    }

1 个答案:

答案 0 :(得分:5)

task1在配置时打印执行时的值(注意<<),task2(在评估apply plugin: ...之后的其余构建脚本之前) )。这解释了为什么task1的println按预期工作,而task2的println没有。

但是,在执行时配置任务为时已晚。相反,插件需要推迟读取用户提供的值,直到配置阶段结束(在评估构建脚本之后,但在执行任何任务之前)。有几种技术可以做到这一点。其中一个更简单的方法是使用project.afterEvaluate { ... }包装任何此类读取访问权限。