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

问题描述:

我有一个多项目C++摇篮建设,产生了一些库和可执行文件。我试图让可执行文件(但不是库)的子项目用“指纹”对象进行编译。如果我洒水木清华这样在各个子项目build.gradle这工作得很好:在父动态配置任务的build.gradle

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。这是我的尝试,将它应用到只是使用cpp-exe插件子项目,以下these instructions

configure(subprojects.findAll { it.plugins.hasPlugin('cpp-exe') }) { 
    compileMain.doFirst { 
     // same code as above 
    } 
} 

唉,这不会被触发。但是,如果我把水木清华这样的限制较少configure,块,这表明,查询插件的想法应该工作:

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

难道是插件没有得到应用到子项目在configure关闭时评估(在*build.gradle)?完全实现这一点可能有一个更简单的方法吗?

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

有几种方法来解决这个问题。一种方法是将特定于cpp-exe项目的所有配置(如应用插件和添加操作)移动到同一位置。要么你做从父生成脚本所有这些配置(例如通过枚举CPP-EXE的子项目,并用一个单一的configure(cppExeProjects) { ... }配置它们),或者您移动CPP-EXE具体配置为自己的构建脚本(比如gradle/cpp-exe.gradle)和应用它来自所选的子项目,如:apply from: "$rootDir/gradle/cpp-exe.gradle"

另一种解决方案是改变构建脚本的计算顺序。但我只会用这个作为最后的手段,这里肯定没有必要。

+0

感谢彼得,使用'从适用:“$ ROOTDIR/gradle产出/ CPP-exe.gradle”'作品一种享受,比原方案可能更优雅。 – sxc731 2012-03-24 19:44:16

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

喜欢的东西:

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

会给你一个开始。