我有一个Gradle构建脚本(build.gradle
),我在其中创建了一些任务。这些任务主要包括方法调用。被调用的方法也在构建脚本中。
现在,情况如下:
我正在创建相当数量的构建脚本,其中包含不同的任务,但使用原始脚本中的相同方法。因此,我想以某种方式提取这些“常用方法”,因此我可以轻松地重复使用它们,而不是为我创建的每个新脚本复制它们。
如果Gradle是PHP,那么以下内容将是理想的:
//script content
...
require("common-methods.gradle");
...
//more script content
但当然,这是不可能的。或者是吗?
无论如何,我怎样才能达到这个效果?这样做的最佳方法是什么?我已经阅读了Gradle文档,但我似乎无法确定哪种方法最简单,最适合这种方法。
提前致谢!
更新
我设法在另一个文件中提取方法
(使用apply from: 'common-methods.gradle'
),
所以结构如下:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
从build.gradle
执行任务后,我遇到了一个新问题:显然,方法在common-methods.gradle
时无法识别。
关于如何解决这个问题的任何想法?
答案 0 :(得分:124)
在Peter's answer的基础上,这是我导出方法的方法:
helpers/common-methods.gradle
的内容:
// Define methods as usual
def commonMethod1(param) {
return true
}
def commonMethod2(param) {
return true
}
// Export methods by turning them into closures
ext {
commonMethod1 = this.&commonMethod1
otherNameForMethod2 = this.&commonMethod2
}
这就是我在另一个脚本中使用这些方法的方法:
// Use double-quotes, otherwise $ won't work
apply from: "$rootDir/helpers/common-methods.gradle"
// You can also use URLs
//apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle"
task myBuildTask {
def myVar = commonMethod1("parameter1")
otherNameForMethod2(myVar)
}
以下是有关在Groovy中将方法转换为闭包的更多信息:link
答案 1 :(得分:68)
无法共享方法,但您可以共享包含闭包的额外属性,这可归结为同样的东西。例如,在ext.foo = { ... }
中声明common-methods.gradle
,使用apply from:
应用脚本,然后使用foo()
调用闭包。
答案 2 :(得分:1)
使用 Kotlin dsl ,其工作方式如下:
build.gradle.kts :
apply {
from("external.gradle.kts")
}
val foo = extra["foo"] as () -> Unit
foo()
external.gradle.kts :
extra["foo"] = fun() {
println("Hello world!")
}
答案 3 :(得分:0)
Kotlin DSL的另一种方法可能是:
my-plugin.gradle.kts
extra["sum"] = { x: Int, y: Int -> x + y }
settings.gradle.kts
@Suppress("unchecked_cast", "nothing_to_inline")
inline fun <T> uncheckedCast(target: Any?): T = target as T
apply("my-plugin.gradle.kts")
val sum = uncheckedCast<(Int, Int) -> Int>(extra["sum"])
println(sum(1, 2))