gradle在子模块中有条件地应用插件而不影响root?

时间:2015-06-29 22:41:54

标签: plugins gradle

我正在修改'local.gradle'的概念,如果local.gradle存在,它可以为子项目添加/扩展build.gradle。简单的例子:

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

这样做可行,并且可以修饰本地构建,但不会“堵塞”我们的连续构建与工作站等的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中的任务和内容并不真正“了解”多项目构建和根构建文件的内容;像tasks.getByPath(':somesub:somejar')这样的东西在local.gradle中似乎没有意义。

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

但是,现在我在root build.gradle中有些东西真的不属于那里 - 因为root永远不会知道sub是否会有local.gradle。注意:buildscript的东西不在所有项目{}或子项目{}中 - 所以它真的不能问我正在处理的当前子的问题,是否有local.gradle;如果是这样的话,在buildcript {}中添加一个新的maven repo来解析可能在local.gradle中使用的插件(此外,root应该真的不需要知道本地文件是否希望应用额外的插件 - 只是闻起来像坏耦合)。

因此可以有条件地包含'local.gradle'文件,以某种方式影响插件“应用”依赖关系的方式,而不必将此信息泄漏到其他地方(即根目录)构建?

1 个答案:

答案 0 :(得分:2)

  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
    
    Root项目目录中的

    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文件,您可以维护该文件。

    希望这能解决您的问题。