Gradle 如何在目标文件夹中的梯度复制任务中使用参数?

Gradle 如何在目标文件夹中的梯度复制任务中使用参数?,gradle,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("m

鉴于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()
            }    
        }
    }
}
tasks.addRule(“模式:initModule_”){String taskName->
if(taskName.startsWith(“initModule_382;”)){
def params=taskName.split(“”);
任务(任务名称){
多拉斯特{
project.ext.moduleName=params.tail().head()
tasks.initModule.execute()
}    
}
}
}
moduleName不会被传递(即使我将其更改为finalizedBy)


非常感谢您的帮助。

因为您已经发现该属性在配置阶段不可用

但是可以通过使用

into "$rootDir/modules/" + project.property("moduleName")
而不是

into "$rootDir/modules/$moduleName"