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

Plugins gradle在子模块中有条件地应用插件,而不影响根?,plugins,gradle,Plugins,Gradle,我正在修补“local.gradle”的概念,如果存在local.gradle,它可以为子项目添加/扩展build.gradle。简单的例子: if(file('local.gradle').exists()){ apply from: 'local.gradle' } 这可以正常工作,可以修饰本地构建,但不能用工作站上的goop等“阻塞”我们的连续构建 问题是,我的一个本地.gradle文件想要使用这样的插件: apply plugin: 'fladoodle' buildscri

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

if(file('local.gradle').exists()){
    apply from: 'local.gradle' 
}
这可以正常工作,可以修饰本地构建,但不能用工作站上的goop等“阻塞”我们的连续构建

问题是,我的一个本地.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插件;一切都很好,绝对路径的东西似乎正在发挥作用。我没有在根设置中包含对local.gradle的任何引用。gradle…我也不想太

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

因此,有条件包含的“local.gradle”文件是否会影响插件“apply from”依赖项,而不必将此信息泄漏到构建的其他位置(即根目录)?

  • buildscript{}
    仅适用于多项目渐变生成中的根项目
  • 这意味着自定义插件的依赖项只能添加到根项目的
    buildscript{}
    块中; 您可以尝试下面的方法,将插件的依赖项从公共
    buildscript{}
    配置中分离出来
  • 根项目的
    build.gradle
    根项目目录中的本地buildscript.gradle 请注意,您仍然没有将配置移动到
    local.gradle
    ,而是为
    buildscript{}
    创建您自己的gradle文件,您可以维护该文件


    希望这能解决您的问题。

    如果我理解正确1。您希望有条件地应用
    local.gradle
    。2.local.gradle应用某个存储库中提供的自定义插件。您希望插件的依赖项定义和
    apply plugin
    语句在
    local.gradle
    中都正确吗?是。你说得很对。当我在local.gradle中有插件的DEP时;有些事情不太对劲:格拉德尔腹肌路径似乎没有解决。把DEP移到根上--使它正常运作--但有点违背了本地的想法。格雷德尔也许我在树上吠叫..花了一段时间才回到这个问题上--但你的建议似乎对我有用。唯一的调整是我在根目录的buildscript{}块中添加了if(file('local-buildscript.gradle').exists(){apply from:'local buildscript.gradle'})。local-buildscript.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
    
    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'
        }
    }