gradle 在影响 root 的子模块中有条件地应用插件 w/o?

gradle apply plugin conditionally in sub-modules w/o affecting root?

我正在修改 'local.gradle' 的概念,如果 local.gradle 存在,可以 add/extend 为子项目提供 build.gradle。简单示例:

if(file('local.gradle').exists()){
    apply from: 'local.gradle' 
}

这工作正常,可以美化本地构建,但不能 'clog' 使用来自工作站等的 goop 来提升我们的连续构建。

问题是,我的一个 local.gradle 文件想要使用这样的插件:

apply plugin: 'fladoodle'
buildscript {
    repositories {
        maven {
            url 'http://dl.bintray.com/niftystuff/pseudorepo'
        }
    }   
    dependencies {
        classpath 'org.home:gradle-fladoodle-plugin:0.1'
    }
}

这有点管用,但是 local.gradle 中的任务和内容并不是 'know' 关于多项目构建和根构建文件的内容; tasks.getByPath(':somesub:somejar') 之类的东西在 local.gradle 中似乎没有意义。

所以我将用于定位插件的构建脚本内容移到了根目录;靠近(实际上是在)根构建中声明其他插件依赖项的部分。 local.gradle 只是有一个应用,然后是那个插件的 gradle 东西;一切都很好,绝对路径的东西现在似乎正在工作。我没有在根 setting.gradle 中包含对 local.gradle 的任何引用...我也不想...

但是,现在我在根目录 build.gradle 中有一些东西确实不属于那里——因为根目录永远不会知道子目录是否会有 local.gradle。注意:buildscript 的东西不在 allprojects{ } 或 subprojects {} 中——所以它真的不能问我正在处理的当前 sub 的问题,是否有 local.gradle;如果是这样,将新的 Maven 存储库添加到 buildscript { } 以解析可能在 local.gradle 中使用的插件(此外,root 应该真的不需要知道本地文件是否希望应用其他插件 - 只是闻起来像耦合不良)。

因此,有条件地包含 'local.gradle' 文件是否会以某种方式影响插件 "apply from" 依赖关系 w/o 必须泄露此信息进入构建的其他地方(即根目录)?

  1. buildscript{} 仅适用于多项目 gradle 构建中的根项目。
  2. 这意味着您的自定义插件的依赖项只能添加到根项目的 buildscript{} 块中; 您可以尝试使用以下方法将插件的依赖项与常见的 buildscript{} 配置
  3. 分开

根项目的 build.gradle

buildscript {
    // Other buildscript configurations

    apply from : 'local-buildscript.gradle'
}
subproject {
    if(file('local.gradle').exists()){
         apply from: 'local.gradle' 
    }
}
// Other code of build.gradle

local-buildscript.gradle 根项目目录

project.buildscript {   // NOTE it is project.buildscript
    repositories {
        maven {
            url 'http://dl.bintray.com/niftystuff/pseudorepo'
        }
    }   
    dependencies {
        classpath 'org.home:gradle-fladoodle-plugin:0.1'
    }
}

请注意,您仍然没有将配置移动到 local.gradle,但您正在为 buildscript{} 创建您自己的 gradle 文件,您可以维护它。

希望这能解决您的问题。