gpt4 book ai didi

gradle - groovy 编译器对 gradle 依赖语法做了什么

转载 作者:行者123 更新时间:2023-12-04 06:46:42 27 4
gpt4 key购买 nike

我了解 gradle DSL

task doTask { logger.info "some text" }

实际上将调用 Project 委托(delegate)对象上的方法 task(String,Closure)。这或多或少是一个短手
task("doTaks", {logger.info("some text")})

没关系。但是当我尝试理解我在第三方构建脚本中看到的一些 gradle DSL 语法时,事情变得复杂了:
task doTask (dependsOn: 'otherTask'){logger.info "some text"}

我认为groovy会从(dependsOn:'otherTask')创建一个 map ,并且不知何故Project方法
task(Map args, String name, Closure config)

将被调用。但是这些额外的括号是如何发挥作用的,为什么它们是必要的,groovy 是如何找出我们想要的呢?以我最小的 groovy 技能,语法对我来说完全违反直觉。我永远不会猜到我必须这样做才能使其工作。

所以,这就是问题所在:groovy 如何弄清楚如何使用这个命令:
task doTask (dependsOn: 'otherTask'){ // some code }

最佳答案

您可以使用以下语法之一调用 groovy 方法:

  • Args 必须在括号内全部用逗号分隔:
    method(arg1, arg2, ..., argN, argClosure)
  • Args 必须全部用逗号分隔,不带括号:
    method arg1, arg2, ..., argN, argClosure
  • 如果最后一个参数是一个闭包,则所有前面的参数必须在括号内全部用逗号分隔,并且右括号后面的代码块(在大括号 {...} 内)将被解释为最后一个 Closure 论据 argClosure :
    method(arg1, arg2, ..., argN) { ... }

    如果你 不要希望花括号内的代码块被解释为 Closure前面方法调用的参数;然后用分号结束方法调用:
    // Because of `;` following { ... } is not a Closure argument for `method`
    method(arg1, arg2, ..., argN); { ... }
  • 接受单个 Map 作为参数的方法或 Map和闭包,可以使用 named parameters 调用句法;这会将每个命名参数转换为映射中的一个条目,最后一个参数将是一个闭包。这将创建以下直观的语法变体:
    method(name1: arg1, name2: arg2, ..., nameN: argN, argClosure)
    method name1: arg1, name2: arg2, ..., nameN: argN, argClosure
    method(name1: arg1, name2: arg2, ..., nameN: argN) { ... }

  • Groovy 提供了大量的语法糖,因此可以找到其他直观的变体;但这让你感受到了 groovy 的处理方式 Closure论据。

    以下是执行方法调用的这些不同方式的工作演示:
    import java.time.LocalDateTime

    def handleWithClosure(data1, data2, closure) {
    closure("$data1. $data2")
    }

    def logger = { println "${LocalDateTime.now()} - $it" }
    handleWithClosure(1, 'All within parenthesis', logger)
    handleWithClosure 2, 'All without parenthesis', logger
    handleWithClosure(3, 'List of arguments within parenthesis and closure outside') { logger(it) }

    def handleMapWithClosure(map, closure) {
    handleWithClosure(map['num'], "[Named Arguments/Map based] ${map['msg']}", closure)
    }

    handleMapWithClosure(msg: 'All within parenthesis', num: 1, logger)
    handleMapWithClosure msg: 'All without parenthesis', num: 2, logger
    handleMapWithClosure(msg: 'List of arguments within parenthesis and closure outside', num: 3) { logger(it) }


    运行它,您可以看到它是如何处理所有这些语法选项的。

    Complete code on GitHub

    希望这可以帮助。

    关于gradle - groovy 编译器对 gradle 依赖语法做了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56202387/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com