Gradle插件DSL:声明位置的限制

Inv*_*row 4 gradle build.gradle

我有几个Gradle脚本可以通过apply from: 'my-build.gradle'.如果我在外部构建文件中使用新插件DSL my-build.gradle,则会因以下错误而失败:

> startup failed:
  Only Project build scripts can contain plugins {} blocks
  See http://gradle.org/docs/2.3/userguide/plugins.html#sec:plugins_block 
  for information on the plugins {} block
Run Code Online (Sandbox Code Playgroud)

查看错误消息中指出的文档并未显示限制为何存在.为什么插件声明的位置有限制?

文件供以下参考.

  1. my-build.gradle 文件:

    plugins {
        id "net.saliman.cobertura" version "2.2.5"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. build.gradle 文件:

    apply from: "my-build.gradle"
    
    // Other stuff
    
    Run Code Online (Sandbox Code Playgroud)

Mat*_*aun 8

这是您可以在外部Gradle文件中使用插件的方法,例如my-build.gradle:

buildscript {
  repositories {
    mavenCentral()
    maven { url "https://plugins.gradle.org/m2/" }
  }
  dependencies {
    classpath "org.sonarqube.gradle:gradle-sonarqube-plugin:1.1"
    classpath "net.saliman:gradle-cobertura-plugin:2.2.8"
  }
}
// Because this is a helper script that's sourced in from a build.gradle, we can't use the ID of external plugins
// We either use the full class name of the plugin without quotes or an init script: http://www.gradle.org/docs/current/userguide/init_scripts.html
apply plugin: org.sonarqube.gradle.SonarQubePlugin
apply plugin: net.saliman.gradle.plugin.cobertura.CoberturaPlugin

// rest of my-build.gradle omitted
Run Code Online (Sandbox Code Playgroud)

上面我已经激活了SonarQubeCobertura的插件.

通常,要获得插件的完全限定类名,您必须查看其.jar文件.

至于为什么你不能plugins {}在外部文件中使用块的技术原因,我不知道.它可能需要执行以下操作:

[...]插件[需要]以Gradle可以轻松快速地提取[他们]的方式指定,然后再执行构建脚本的其余部分.它还要求使用的插件定义有点静态.

欢欣鼓舞:

Gradle的未来版本将删除此限制.

  • 感谢您的参考 :) 我知道解决方法,但有点困惑为什么`plugins` 关闭不能从外部文件工作。 (3认同)