Как применить плагин для всех проектов с помощью нового механизма плагинов Gradle?

Перед Gradle 2.1 я мог бы применить плагин ко всем проектам, с помощью allProjects закрытия (по prevoisly разрешения баночки, конечно):

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1"
  }
}

allprojects {
    apply plugin: "com.jfrog.artifactory"
}

С новым механизмом публикации похоже, что закрытие plugins не может использоваться внутри всех allprojects:

allprojects {

    plugins {
        id "com.jfrog.artifactory" version "3.0.1"
    }
}

не удается:

"Не удалось найти метод plugins() для аргументов [build_xxxx_run_closure1_closure4 @yyyyy] в корневом проекте"

Каковы правила использования закрытия plugins? Плагин применяется только к текущему проекту? Если да, то как я могу применить его ко всем проектам без повторения закрытия plugins внутри каждой сборки?

Ответ 1

Новый синтаксис plugins {...} не может использоваться в рамках allprojects {...} или subprojects {...}. Кроме того, его можно использовать только в скриптах сборки (без плагинов сценариев, сценариев инициализации и т.д.). Если вы хотите избежать необходимости применять плагин к каждому проекту отдельно, я бы предложил использовать старую нотацию. Это проблема, о которой знает команда Gradle, и решение будет представлено в будущих версиях.

Обновление: начиная с Gradle 3.0, вы можете сделать это несколько измененным образом. Вы все еще должны явно использовать apply() но вам больше не нужно иметь дело со всей buildscript { } чтобы получить плагин в вашем пути к классам. Это также позволяет условно применять плагины. Ознакомьтесь с примечаниями к выпуску Gradle 3.0 для получения дополнительной информации.

plugins {
    id 'my.special.plugin' version '1.0' apply false
}

allprojects {
    apply plugin: 'java'
    apply plugin: 'my.special.plugin'
}