【问题标题】:apply() method syntax in groovygroovy 中的 apply() 方法语法
【发布时间】:2020-09-13 19:34:25
【问题描述】:

在下面的语法中:

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() 方法是传递键值对plugin: 'application',其中键是plugin & 值是'application'

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

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

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 closures


    【解决方案1】:

    这是一个惯用的常规“快捷方式”。

    线

    apply(plugin: 'application')
    

    可以改写为:

    apply( [ plugin: 'application' ] )
    

    并且意味着,apply() 方法是使用 Groovy Map 字面量调用的。 地图文字替换了 java 的:

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

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

    该行也可以改写为:

    apply plugin:'application'
    

    完全没有括号。

    更新:

    第二个问题:

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

    在 Groovy 中,如果方法的最后一个参数是闭包,它可以写成

    copyDeps( map ){ }
    

    copyDeps map, {}
    

    或者(更javaish)

    copyDeps( map, {} )
    

    更新 2:

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

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

    【讨论】:

    • 查询已编辑,您能回答第二个问题吗?
    猜你喜欢
    • 2020-04-24
    • 1970-01-01
    • 2023-03-29
    • 2017-03-31
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    相关资源
    最近更新 更多