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)
我有一个非常简单的多项目构建,如下所示:
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)