在父build.gradle中动态配置任务

时间:2012-03-23 12:23:40

标签: gradle

我有一个多项目C ++ Gradle构建,它可以生成许多库和可执行文件。我正在尝试使用'指纹'对象来获取可执行文件(但不是库)子项目。如果我在个别子项目“build.gradle

中撒上这样的smth,这样可以正常工作
compileMain.doFirst {
    // code to generate a 'BuildInfo.cpp' from from a template.
    // embeds name of executable in so has to be generated anew for each exe
}

遵循DRY原则,我宁愿在顶级build.gradle中一劳永逸地做到这一点。这是我尝试将其应用于these instructions之后仅使用cpp-exe插件的子项目:

configure(subprojects.findAll { it.plugins.hasPlugin('cpp-exe') }) {
    compileMain.doFirst {
       // same code as above
    }
}
唉,这不会被触发。但是,如果我在限制较少的configure块中添加这样的smth,这表明查询插件的想法应该工作:

configure(subprojects.findAll { true }) { 
    task mydebug << {
        if ( project.plugins.hasPlugin( 'cpp-exe' ) ) {
            println ">>> $project.name has it!"
        }
    }
}

在评估configure闭包时(在顶级build.gradle),插件是否会被应用于子项目?可能有一种更简单的方法来实现这一目标?

2 个答案:

答案 0 :(得分:4)

您可能在子项目的构建脚本中应用cpp-exe插件。默认情况下,父构建脚本在其子项之前进行评估,这解释了为什么它没有找到任何已应用cpp-exe的项目。

有几种方法可以解决这个问题。一种方法是将特定于cpp-exe项目的所有配置(例如应用插件并添加操作)移动到同一位置。您可以从父构建脚本执行所有此类配置(例如,通过枚举cpp-exe子项目并使用单个configure(cppExeProjects) { ... }配置它们),或者将cpp-exe特定配置移动到其自己的构建脚本中(例如gradle/cpp-exe.gradle)并从选定的子项目中应用它,如:apply from: "$rootDir/gradle/cpp-exe.gradle"

另一种解决方案是更改构建脚本的评估顺序。但我只会将此作为最后的手段,而且在这里肯定没有必要。

答案 1 :(得分:1)

Gradle 1.5最近刚出来,我不确定这是否是一项新功能,但看起来,您可以使用 afterEvaluate 解决问题。 请查看http://www.gradle.org/docs/current/userguide/build_lifecycle.html

中的第53.6.1节

类似的东西:

subprojects {subProject ->
  afterEvaluate {
    if ( subProject.plugins.hasPlugin('cpp-exe')){
      println "Project $subProject.name has plugin cpp-exe"
    }
  }
}

会给你一个开始。