使用扩展中的params配置自定义插件

时间:2013-04-04 22:27:02

标签: gradle

您好我正在尝试根据插件扩展值动态创建和配置任务,问题似乎是评估顺序,有什么方法可以解决它吗?

apply plugin: SetupPlugin 

setup {
     destDir = 'some directory set per project in build.gradle'
     sourceFile = 'some file set per project in build.gradle' 
}


class PluginExtension {
    String destDir
    String sourceFile
}

class SetupPlugin implements Plugin<Project> {
    def placeholders

    void apply(Project project) {
        project.extensions.create("setup", PluginExtension)

        project.task ("setupEnvironment", type: Copy) {
            doFirst() {
                //computes placeholders <-- project.setup has value here
            }

            into (project.setup.destDir){ //<-- project.setup is null
                from project.setup.sourceFile
            }
            filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders)
        }   
    }
}

3 个答案:

答案 0 :(得分:1)

将其移入doFirst块会导致一些副作用,因为gradle最新任务可能会遇到问题,因为在执行时重新配置复制任务的参数而不是配置时间。应该做的诀窍是使用闭包来推迟评估:

...
void apply(Project project) {
        project.extensions.create("setup", PluginExtension)

        project.task ("setupEnvironment", type: Copy) {
            doFirst() {
                //computes placeholders <-- project.setup has value here
            }

            into {project.setup.destDir}
            from { project.setup.sourceFile }
            filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: placeholders)
        }   
}
...
希望有所帮助!

欢呼声, 勒

答案 1 :(得分:0)

这是因为在应用设置设置之前调用了apply

适用于doFirst,因为它在构建期间调用apply。 也许你可以将你的副本包装成doLast

答案 2 :(得分:0)

事实证明我问了一个我认为与此非常相似的问题。我可能会错过一个微妙的区别,但如果有帮助:here it is.