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

Pie*_*VDE 76 gradle build.gradle

我有一个Gradle构建脚本(build.gradle),我在其中创建了一些任务.这些任务主要包括方法调用.被调用的方法也在构建脚本中.

现在,情况如下:

我正在创建相当数量的构建脚本,其中包含不同的任务,但使用原始脚本中的相同方法.因此,我想以某种方式提取这些"常用方法",因此我可以轻松地重复使用它们,而不是为我创建的每个新脚本复制它们.

如果Gradle是PHP,那么以下内容将是理想的:

//script content
...
require("common-methods.gradle");
...
//more script content
Run Code Online (Sandbox Code Playgroud)

但当然,这是不可能的.或者是吗?

无论如何,我怎样才能达到这个结果?这样做的最佳方法是什么?我已经阅读了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
Run Code Online (Sandbox Code Playgroud)

执行任务后build.gradle,我遇到了一个新问题:显然,方法在进入时无法识别common-methods.gradle.

关于如何解决这个问题的任何想法?

Mat*_*aun 136

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
}
Run Code Online (Sandbox Code Playgroud)

这就是我在另一个脚本中使用这些方法的方法:

// 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)
}
Run Code Online (Sandbox Code Playgroud)

这里有更多关于在Groovy中将方法转换为闭包的方法:link


Pet*_*ser 71

共享方法是不可能的,但是您可以共享包含闭包的额外属性,这可归结为同样的东西.例如,声明ext.foo = { ... }common-methods.gradle,使用apply from:应用脚本,然后调用与关闭foo().

  • 显然,我之前评论中的问题是可能的.谢谢Peter,回答这个问题! (2认同)

Sim*_*n L 8

使用Kotlin dsl,它的工作方式如下:

build.gradle.kts

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

val foo = extra["foo"] as () -> Unit
foo()
Run Code Online (Sandbox Code Playgroud)

external.gradle.kts

extra["foo"] = fun() {
  println("Hello world!")
}
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,有没有办法分享实际类型?您基本上失去了类型安全性和编译器的帮助...如果您可以共享包含您的方法的类,那么您可以使用编译器。 (2认同)