如何在目标文件夹中的gradle copy任务中使用参数?

时间:2014-08-21 10:03:34

标签: gradle

鉴于gradle中的以下任务,开发人员将通过以下方式启动新模块:

gradle initModule -PmoduleName=derp

task initModule(type: Copy) {
    description "Initialize an empty module based on the template. Usage: gradle initModule -P moduleName=derp"

    onlyIf { project.hasProperty("moduleName") }

    from "$rootDir/modules/template"
    into "$rootDir/modules/$moduleName"
}    

我无法运行gradle,因为在评估期间未定义moduleName,尽管我希望“onlyIf”会这样做。

要解决此问题,我将其分配给保护块中的本地定义变量:

def modName = ""

if (!project.hasProperty("moduleName")) {
    logger.error("Invalid moduleName : It can't be")
} else {
    modName = moduleName
}

并最终使用新变量来维持配置阶段。

这是正确的方法吗?这感觉不对。

此外,如果我使用规则使这一点更优雅:

tasks.addRule("Pattern: initModule_<mod name>") { String taskName ->

    if (taskName.startsWith("initModule_")) {
        def params = taskName.split('_');
        task(taskName)  {    
            doLast {
                project.ext.moduleName = params.tail().head()
                tasks.initModule.execute()
            }    
        }
    }
}

不传递moduleName(即使我将其更改为finalizedBy)。

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

正如您已经发现的那样,在配置阶段该属性不可用。

但是可以使用

将查找推迟到执行阶段
into "$rootDir/modules/" + project.property("moduleName")

而不是

into "$rootDir/modules/$moduleName"