考虑以下设置
rootProject
|--projectA
|--projectB
Run Code Online (Sandbox Code Playgroud)
中有一个任务taskB,projectB我希望在中的复制任务taskA中参考该任务的输出projectA。例如,taskA可能看起来像:
task taskA(type: Copy) {
dependsOn ':projectB:taskB'
from ':projectB:taskB.outputs'
into 'someFolder'
}
Run Code Online (Sandbox Code Playgroud)
当然,上面的示例实际上不起作用。虽然可以将任务作为:projectB:taskB依赖项引用,:projectB:taskB.outputs但对于Gradle而言似乎没有任何意义。我尝试阅读Gradle文档,但没有找到任何引用我正在尝试做的事情。
公认的答案只是解决该问题的推荐方法。但是,现在Gradle团队不鼓励建立这种项目依赖关系并从一个项目进入另一个项目。取而代之的是,项目只能使用发布变体相互交互。因此,惯用的方式(但可悲的是现在更冗长)将是:
在生产方(projectB)定义一个不可解析但可由其他项目使用的配置,并创建一个新的变体(称为taskB-variant)
configurations.create("taskElements") {
isCanBeResolved = false
isCanBeConsumed = true
attributes {
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, "taskB-variant"))
}
outgoing.artifact(taskB.outputs)
}
Run Code Online (Sandbox Code Playgroud)
在使用方(projectA)上,为同一变体定义一个可解析但不可使用的配置,并定义对projectB
val taskOutputs by configurations.creating {
isCanBeResolved = true
isCanBeConsumed = false
attributes {
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class, "taskB-variant"))
}
}
dependencies {
taskOutputs(project(":projectB"))
}
tasks.register<Copy>("taskA") {
from taskOutputs
into 'someFolder'
}
Run Code Online (Sandbox Code Playgroud)
你如何去耦的输出产生这样和发布变种(称为“taskB变”)成为之间的接口projectA和projectB。因此,无论何时更改创建输出的方式,您都只需重构,projectB而无需projectA确保您的输出最终保存在taskElements配置中。
目前,它仍然很冗长,但希望Gradle将来会获得更强大的API,以描述这种项目关系。
projectA build.gradle应该是:
evaluationDependsOn(':projectB')
task taskA(type:Copy, dependsOn:':projectB:taskB'){
from tasks.getByPath(':projectB:taskB').outputs
into 'someFolder'
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1981 次 |
| 最近记录: |