从Gradle构建脚本中提取常用方法

gc0ot86w  于 2022-12-23  发布在  其他
关注(0)|答案(5)|浏览(129)

我有一个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中时,它们不会被识别。
这怎么能解决呢?

fae0ux8s

fae0ux8s1#

基于Peter的回答,下面是我导出方法的方式:
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)
}

Here's more介绍如何在Groovy中将方法转换为闭包。

ifsvaxew

ifsvaxew2#

共享方法是不可能的,但是你可以共享包含闭包的额外属性,这归结起来是一样的,例如,在common-methods.gradle中声明ext.foo = { ... },使用apply from:应用脚本,然后用foo()调用闭包。

bhmjp9jg

bhmjp9jg3#

使用KotlinDSL,其工作原理如下:

构建版本.gradle.kts

apply {
  from("external.gradle.kts")
}

val foo = extra["foo"] as () -> Unit
foo()

外部梯度kts

extra["foo"] = fun() {
  println("Hello world!")
}
j8yoct9x

j8yoct9x4#

我建议对Matthias Braun's answer做一个小小的调整,与其两次编写相同的方法名并保持其清晰和一致,为什么不简单地执行以下操作呢?

ext.commonMethod1 = (param) -> {
    return true
} as Closure<boolean>

as-运算符的用法只是显式地告诉我们,该函数将返回boolean-类型的值。
因为毕竟,这还是很棒的好事。不错吧?

pbpqsu0x

pbpqsu0x5#

KotlinDSL的另一种方法是:

我的插件.gradle.kts

extra["sum"] = { x: Int, y: Int -> x + y }

设置.分级.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))

相关问题