我有一个多项目Gradle构建,其中子项目被分配了独立于根项目的版本号。我想将这个版本号注入每个子项目的几个资源文件中。通常,我会通过在根构建中为每个子项目配置processResources任务来完成此操作。但是,问题是Gradle似乎在加载子项目的构建文件之前正在执行processResources任务,并且正在注入“unspecified”作为版本。
目前,我的项目如下:
/settings.gradle
include 'childA' // ... and many others
/build.gradle
subprojects {
apply plugin: 'java'
apply plugin: 'com.example.exampleplugin'
}
subprojects {
// This has to be configured before processResources
customPlugin {
baseDir = "../common"
}
processResources {
// PROBLEM: version is "unspecified" here
inputs.property "version", project.version
// Inject the version:
from(sourceSets.main.resources.srcDirs) {
include 'res1.txt', 'res2.txt', 'res3.txt'
expand 'version':project.version
}
// ...
}
}
/childA/build.gradle
version = "0.5.424"
我考虑在root build.gradle
的开头添加evaluationDependsOnChildren(),但这会导致错误,因为childA/build.gradle
在customPlugin { ... }
之前运行。我尝试过使用dependsOn,mustRunAfter和其他技术,但似乎都没有达到预期的效果。 (也许我不完全理解生命周期,但似乎根项目在子项目之前配置和执行。不应该配置root,然后配置子项目,然后执行?)
如何在不需要大量复制/粘贴或样板的情况下将每个子项目的版本注入相应的资源文件中?
答案 0 :(得分:2)
我为自己弄明白这一点。我使用init.gradle文件将某些内容应用到rootProject,但我需要来自子项目的数据。
第一个选项是在修改之前评估每个子项目:
rootProject {
project.subprojects { sub ->
sub.evaluate()
//Put your code here
但我不确定迫使子项目进行评估会产生什么副作用,所以我做了以下事情:
allprojects {
afterEvaluate { project ->
//Put your code here
答案 1 :(得分:1)
尝试这样做:
"\\."
否则subprojects { project ->
// your code
}
将引用未指定版本的根项目。
答案 2 :(得分:0)
您可以尝试使用带有钩子的此方法:
gradle.projectsEvaluated({
// your code
})