我有一个多项目C++Gradle构建,它生成了许多库和可执行文件。我正在尝试使用"fingerprint"对象编译可执行文件(但不是库)子项目。如果我在各个子项目的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
中一劳永逸地做到这一点。这是我的尝试,只将其应用于使用cpp-exe
插件的子项目,遵循以下说明:
configure(subprojects.findAll { it.plugins.hasPlugin('cpp-exe') }) {
compileMain.doFirst {
// same code as above
}
}
唉,这不会被触发。然而,如果我把这样的smth放在限制较少的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"
}
}
}
会给你一个开始。