配置子项目后执行Gradle任务

时间:2016-08-19 11:59:48

标签: gradle

我有一个多项目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.gradlecustomPlugin { ... }之前运行。我尝试过使用dependsOn,mustRunAfter和其他技术,但似乎都没有达到预期的效果。 (也许我不完全理解生命周期,但似乎根项目在子项目之前配置和执行。不应该配置root,然后配置子项目,然后执行?)

如何在不需要大量复制/粘贴或样板的情况下将每个子项目的版本注入相应的资源文件中?

3 个答案:

答案 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
})