鉴于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)。
感谢任何帮助。
答案 0 :(得分:1)
正如您已经发现的那样,在配置阶段该属性不可用。
但是可以使用
将查找推迟到执行阶段into "$rootDir/modules/" + project.property("moduleName")
而不是
into "$rootDir/modules/$moduleName"