首先,私有(private) maven repo 中部署了一些常用脚本:
http://domain/repo/com/d/build/script/java-project/1.0/java-project-1.0.gradle
http://domain/repo/com/d/build/script/maven/1.0/maven-1.0.gradle
在目标项目中,build.gradle
subprojects {
apply from: 'http://domain/repo/com/d/build/script/java-project/1.0/java-project-1.0.gradle'
apply from: 'http://domain/repo/com/d/build/script/maven/1.0/maven-1.0.gradle'
}
没关系!
但,
ext.applyScript = { script, version ->
apply from: "http://domain/repo/com/d/build/script/${script}/${version}/${script}-${version}.gradle"
}
subprojects {
applyScript('java-project', '1.0')
applyScript('maven', '1.0')
}
它会失败 ,带有消息:
“错误:无法添加任务':javadocJar',因为具有该名称的任务已经存在。”
任务“:javadocJar”在脚本“java-project-1.0.gradle”中定义
我们有几个子项目。
为什么 ?
顺便说一句:任何人都可以给我一个“申请来源:”的来源位置吗?
我自己很难定位。
最佳答案
问题是在 latte 案例中,您将脚本多次应用于同一个根项目。
这怎么可能?这很有趣,也有点棘手:
applyScript
作为扩展容器的闭包ext
当前 Gradle 项目的 apply from: ...
作为方法调用处理 apply(Map)
在 org.gradle.api.plugins.PluginAware
接口(interface)是 org.gradle.api.Project
的 super 接口(interface)之一界面apply ...
您正在调用apply
当前 Gradle 项目上的方法(指定 apply ...
的方法)apply ...
作为关闭的一部分,标准委派适用this.apply ...
相同this
默认指向作为根项目的封闭类/对象(这里不能是其他任何东西)因此,即使看起来您正在将 2 个脚本应用于所有子项目,实际上您实际上是将 2 个脚本应用于根项目 N 次(N 是子项目的数量)。
您需要做的是将委托(delegate)更改为正确的
Project
实例。 :ext.applyScript = { project, script, version ->
project.apply from: "..."
}
subprojects {
applyScript(it, 'java-project', '1.0')
applyScript(it, 'maven', '1.0')
}
ext.applyScript = { script, version ->
apply from: "..."
}
subprojects {
applyScript.resolveStrategy = Closure.DELEGATE_FIRST
applyScript.delegate = it
applyScript('java-project', '1.0')
applyScript('maven', '1.0')
}
关于gradle脚本,直接dsl和 “apply from:”的自定义函数调用有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40373209/