【问题标题】:gradle get value from extension (pass as input to task)gradle 从扩展中获取值(作为输入传递给任务)
【发布时间】:2014-05-30 19:30:47
【问题描述】:

我的插件中有以下代码:

    @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
        }
    }

【问题讨论】:

    标签: plugins gradle


    【解决方案1】:

    task1 在执行时打印值(注意&lt;&lt;),task2 在配置时打印(在评估apply plugin: ... 之后的其余构建脚本之前)。这就解释了为什么 task1 的 println 可以按预期工作,而 task2 的 println 却不能。

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

    【讨论】:

    • 您的意思是在 afterEvaluate 或整个任务定义中仅包装扩展读取?当我包装整个任务时,它工作正常。谢谢
    • 只读取用户提供的值。例如,当插件添加任务时,它不能推迟此操作,否则用户无法在构建脚本的其余部分中重新配置任务。
    • 非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2012-08-24
    • 2019-06-29
    • 1970-01-01
    • 2014-10-18
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多