gradle - 理解 Gradle-Groovy 语义

标签 gradle groovy

我很难理解 gradle 脚本的语义 w.r.t 如何在 groovy 中看到它们。

1)以下代码段是什么意思?

task copy(type: Copy) {
   into "target"
   with baseSpec
}

据我了解,在我看来,任务是用命名参数“type”实例化的,它的值是“Copy”。我不知道什么是“进入”,“与”。它们是任务类的参数吗?顺便说一句,任务是类还是接口(interface)?

2)什么是“脚本 block ”?是闭包吗?
3) 什么是“ Action ”?它们也是用匿名类实例化的接口(interface)的闭包或对象吗?

基本上,我迷失了如何将所有这些放在一起作为一个普通的 groovy ?

最佳答案

Groovy 是一种用于构建 DSL(领域特定语言)的强大语言。 Gradle 像许多其他库一样使用它。

它基于 Groovy 的几个属性

  • 括号是可选的
    fun("myparameter")
    fun "myparameter"
    
  • 您可以在方法上具有命名参数
    fun prop:'value', otherprop:'othervalue'
    fun([prop:'value', otherprop:'othervalue'])
    
  • 如果方法的最后一个参数是闭包,可以写在方法调用之外
    fun(prop:'value') {
      //..closure call
    }
    fun([prop:'value'], { /*closure*/ })
    
  • 您可以在 groovy 对象上获取/设置任何属性或调用任何方法:您可以通过 missingMethod 动态添加行为, missingProperty , getPropertysetProperty , ..
    object.somefun "42"
    object.missingMethod("somefun", ["42"])
    
  • 在闭包中,您有一个特殊的对象,称为委托(delegate)。它可以在运行时设置,任何非本地属性或方法调用都可以委托(delegate)给这个委托(delegate)
    def fun = { copy "this_file" }
    def fun = { delegate.copy("this_file") }
    

    this documentation或 builder 模式

  • 使用此属性,可以编写您的脚本(由于 AST 转换,这不是真的..):
    task(copy([type: Copy], { it -> 
      delegate.into("target")
      delegate.with(baseSpec)
    }))
    
    delegate是一个实现 missingMethod 的对象,并根据方法调用和上下文生成对象。

    一个更复杂的脚本:
    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
        }
    }
    

    相当于:
    buildscript({ it -> 
      delegate.repositories({delegate.mavenCentral()})
      delegate.dependencies({delegate.classpath([group:'commons-codec', name:'commons-codec', version:'1.2'])})
    })
    

    关于gradle - 理解 Gradle-Groovy 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35389685/

    相关文章:

    gradle - Gradle构建未调用JUnit

    java - Gradle - 排除文件与 jar 打包

    class - Groovy: map 文字上的 getClass 方法返回 null

    grails - 为什么grails返回一个空对象数组?

    xml - 如何使用 Groovy 在 xml 中插入/移动/删除节点?

    maven - 是否可以在类似于 Maven install :install-file? 的 gradle 中将文件安装到本地缓存

    android - 如何在 Android Studio 中查看项目的当前依赖项列表?

    maven - Gradle下载https://repo1.maven.org/maven2/org/codehaus/groovy/groovy-all/2.4.4/非常慢且失败

    java - 如何通过 GPars 中的主 Actor 终止所有从属 Actor?

    java - Groovy 等价于 java 的没有访问修饰符的声明