如何使用新的Gradle插件机制将插件应用于所有项目?

JBa*_*uch 40 gradle

在Gradle 2.1之前,我可以通过使用allProjects闭包将插件应用于所有项目(当然,通过prepreisly解析jar):

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

allprojects {
    apply plugin: "com.jfrog.artifactory"
}
Run Code Online (Sandbox Code Playgroud)

使用新的发布机制,看起来plugins封闭不能在内部使用allprojects:

allprojects {

    plugins {
        id "com.jfrog.artifactory" version "3.0.1"
    }
}
Run Code Online (Sandbox Code Playgroud)

失败了:

"无法在根项目中找到参数[build_xxxx_run_closure1_closure4 @ yyyyy]的方法插件()

使用plugins闭包的规则是什么?该插件仅适用于当前项目吗?如果是这样,如何在不重复plugins每个构建内部的闭包的情况下将其应用于所有项目?

Mar*_*ira 57

plugins {...}语法不能在一个allprojects {...}subprojects {...}闭包中使用.此外,它只能在构建脚本中使用(没有脚本插件,init脚本等).如果你想避免必须单独将插件应用于每个项目,我建议使用旧的表示法.这是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'
}
Run Code Online (Sandbox Code Playgroud)

  • 新的闭包语法是使sonarqube插件工作的唯一方法,并且由于上述错误,无法使新的插件闭包语法适用于我的项目.难怪JVM语言因这些基本内容的糟糕基础设施而得名.注意: - 在我的情况下,插件闭包在旧的apply插件代码之后的所有片段之外. (4认同)