首页 文章

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

提问于
浏览
65

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

现在,情况如下:

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

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

//script content
...
require("common-methods.gradle");
...
//more script content

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

无论如何,我怎样才能达到这个结果?这样做的最佳方法是什么?我已经阅读了Gradle文档,但我似乎无法确定哪种方法最简单,最适合这种方法 .

提前致谢!


UPDATE:

我设法在另一个文件中提取方法

(使用 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 执行任务后,我've bumped into a new problem: apparently, methods don' t在 common-methods.gradle 时被识别 .

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

3 回答

  • 115

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

  • 1

    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

  • 63

    使用 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!")
    }
    

相关问题