【问题标题】:Execute Gradle task after subprojects are configured配置子项目后执行 Gradle 任务
【发布时间】:2016-08-19 11:59:48
【问题描述】:

我有一个多项目 Gradle 构建,其中为子项目分配了独立于根项目的版本号。我想将此版本号注入到每个子项目中的几个资源文件中。通常,我会通过为根构建中的每个子项目配置 processResources 任务来做到这一点。但是,问题在于 Gradle 似乎在加载子项目的构建文件之前正在执行 processResources 任务,并且正在注入“未指定”作为版本。

目前,我的项目是这样的:

/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项目是在子项目之前配置和执行的,不应该是先配置root,再配置子项目,再执行吗?)

如何在没有大量复制/粘贴或样板的情况下将每个子项目的版本注入到适当的资源文件中?

【问题讨论】:

  • 你有没有想过这个问题?您可以做的一件事是调用 project.subprojects { sub -> sub.evaluate() //在评估子项目后将代码放在这里} 但是我正在尝试在不更改评估逻辑的情况下执行此操作,所以如果您想出了另一个解决方案我很想听

标签: gradle


【解决方案1】:

我自己解决了这个问题。我正在使用 init.gradle 文件将某些内容应用于 rootProject,但我需要来自子项目的数据。

第一个选项是在我修改每个子项目之前对其进行评估:

rootProject {
    project.subprojects { sub ->
        sub.evaluate()
        //Put your code here

但我不确定强制子项目评估会产生什么副作用,所以我做了以下操作:

allprojects {
    afterEvaluate { project ->
         //Put your code here

【讨论】:

  • 您可以尝试更改这两个的顺序,如afterEvaluate { allprojects { ... } } 那样,这样您的代码将在开始迭代之前等待一次,而不是相反。
【解决方案2】:

你可以试试这个方法,用一个钩子:

gradle.projectsEvaluated({
   // your code
})

【讨论】:

    【解决方案3】:

    尝试这样做:

    subprojects { project ->
        // your code
    }
    

    否则project 将引用您未指定版本的根项目。

    【讨论】:

    • 试过了,但是 gradle 说 'project' 没有这些属性,虽然我是在子项目中设置的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多