Gradle: 任务不会根据它使用的配置执行另一个任务

Gradle: Task does not execute another task based on the configuration it uses

我有一个非常简单的多项目构建,如下所示:

module1,生成一个publicAPIjar,通过“public[=60=暴露出来]”配置:

configurations {
    publicAPI
}

task generatePublicAPI(type: Jar) {
    outputs.upToDateWhen { false }
    baseName 'public-api'
    from sourceSets.main.output
}

artifacts {
    publicAPI generatePublicAPI
}

module2,它使用publicAPIjar(通过引用module1中定义的'publicAPI'配置)生成一个应用程序jar:

configurations {
    generateApplication
}

dependencies {
    generateApplication project(path: ':module1', configuration: 'publicAPI')
}

task jarApp(type: Jar) {
    baseName 'app'
    from configurations.generateApplication.collect {
        it.isDirectory() ? it : zipTree(it)
    }
}

现在,当我执行'gradle :module2:jarApp" 任务时,我得到了以下错误:

Cannot expand ZIP '/home/picasso/Documents/GradlePlayground/module1/build/libs/public-api.jar' as it does not exist

我可以看到 gradle 没有尝试执行模块 1 的 'generatePublicAPI'

但是,如果我使 "jarApp" 任务明确依赖于 "generatePublicAPI" 任务,

task jarApp(dependsOn: 'module1:generatePublicAPI', type: Jar) {...}

那么一切都很好。

BUT,这种方法是否违背了使用依赖配置的目的之一,这样我就不必担心 module1 的构建细节,例如哪个任务生成 jar 及其生成的工件?

我认为 gradle 能够通过遵循引用的依赖项配置的 "route" 来计算出它需要执行的任务。

我是否遗漏了一些东西以便 "generatePublicAPI" 任务可以自动执行而无需为 "createApp" 任务显式声明 "dependsOn"?

我在 Gradleware 的论坛上问了同样的问题,并从一位核心开发人员那里得到了答案,这里是 link

基本上,问题是 collect 方法 returns 一个新集合,但是 gradle 无法知道这个新集合是从配置中生成的,因此它不能'无法推断要执行哪个任务。

解决方案不是声明对任务的依赖,而是声明对实际配置的依赖,如下所示:

task jarApp(dependsOn: configurations.generateApplication, type: Jar)