Groovy 中的 apply() 方法语法

apply() method syntax in groovy

提问人:overexchange 提问时间:5/27/2020 最后编辑:Jonathan Halloverexchange 更新时间:6/5/2020 访问量:1093

问:

在以下语法中:

plugins({
  id('application')
  id 'java'
  id('com.github.johnrengelman.shadow').version('4.0.1')
})
allprojects(
  {
    apply(plugin: 'application')
    apply(plugin: 'java')
    apply(plugin: 'com.github.johnrengelman.shadow')

    repositories({
      mavenCentral()
    })
  }
  ....

  task copyDeps(type: Copy) {
      from (configurations.runtime + configurations.testRuntime) exclude '*'
      into '/tmp'
  } 
)

我的理解是,

apply()方法传递 key-value ,其中 key 是 & value 是plugin: 'application'plugin'application'

从方法的语法方面来看,不是一个可读的语法:apply()plugin: 'application'

1)我如何理解这个语法?类型的参数是通过方法传递的吗?apply(plugin: 'application')plugin: 'application'Stringapply()

2)

以下语法

task copyDeps(type: Copy) {  // Line 54
          from (configurations.runtime + configurations.testRuntime) exclude '*'
          into '/tmp'
      }

写成

tasks.create('copyDeps', Copy, { 
                                from(configurations.runtime + configurations.testRuntime).exclude('*')
                                into(buildDir)
                                }
            )

但给出错误:

FAILURE: Build failed with an exception.

* Where:
Build file '/home/../build.gradle' line: 54

?

Java Gradle Groovy 闭包

评论


答:

2赞 injecteer 5/27/2020 #1

这是一个惯用的时髦“捷径”。

线

apply(plugin: 'application')

可以改写为:

apply( [ plugin: 'application' ] )

并表示,该方法是使用 Groovy Map 文本调用的。 Map literal 取代了 java 的:apply()

Map map = new HashMap();
map.put( "plugin", "application" );

如果作为最后一个参数的方法接受映射,则可以省略方括号。

该行也可以改写为:

apply plugin:'application'

根本没有括号。

更新:

第二个问题:

是的,它可以(如果它编译)。它看起来很丑,但很有效。

在 Groovy 中,如果 method 的最后一个参数是闭包,则可以将其写为

copyDeps( map ){ }

copyDeps map, {}

或(更 javaish)

copyDeps( map, {} )

更新2:

tasks.create('copyDeps', Copy, {})并且这次也可以根据 ref-doc 在 Gradle 中互换。task copyDeps(type: Copy) {}

这是对类属性的普通方法调用,而表示另一个 Groovy 功能:DSL Builders ->这里使用 Gradle DSL 构建器。tasks.create()task copyDeps()

评论

0赞 overexchange 5/27/2020
查询已编辑,您能回答第二个问题吗?