Синтаксис метода apply () в groovy - PullRequest
0 голосов
/ 27 мая 2020

В синтаксисе ниже:

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' аргумент типа String, переданный через метод apply()?

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

?

1 Ответ

2 голосов
/ 27 мая 2020

Это идиоматия c groovy «сокращение».

Строка

apply(plugin: 'application')

может быть переписана как:

apply( [ plugin: 'application' ] )

и означает, что метод apply() вызывается с литералом Groovy Map. Литерал карты заменяет java:

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

Если метод в качестве последнего аргумента принимает карту, квадратные скобки можно опустить.

Строку также можно переписать как:

apply plugin:'application'

без скобок.

ОБНОВЛЕНИЕ:

2-й вопрос:

да, может (если компилируется). Выглядит уродливо, но действителен.

В Groovy, если последний аргумент метода является закрытием, его можно записать как

copyDeps( map ){ }

или

copyDeps map, {}

или (подробнее javai sh)

copyDeps( map, {} )

UPDATE 2:

tasks.create('copyDeps', Copy, {}) и task copyDeps(type: Copy) {} на этот раз также взаимозаменяемы в Gradle согласно ref-do c .

tasks.create() - это простой вызов метода для свойства класса, тогда как task copyDeps() представляет другую Groovy возможность: построители DSL -> здесь используется построитель Gradle DSL.

...