在父动态配置任务的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"
。
另一种解决方案是改变构建脚本的计算顺序。但我只会用这个作为最后的手段,这里肯定没有必要。
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"
}
}
}
会给你一个开始。
感谢彼得,使用'从适用:“$ ROOTDIR/gradle产出/ CPP-exe.gradle”'作品一种享受,比原方案可能更优雅。 – sxc731 2012-03-24 19:44:16