考虑以下设置
rootProject
|--projectA
|--projectB
taskB
中有一项任务projectB
,我想在taskA
中的复制任务projectA
中引用该任务的输出。例如,taskA
可能类似于:
task taskA(type: Copy) {
dependsOn ':projectB:taskB'
from ':projectB:taskB.outputs'
into 'someFolder'
}
当然上面的例子实际上并不起作用。虽然将任务引用为:projectB:taskB
作为依赖项是可以的,但:projectB:taskB.outputs
似乎对Gradle没有任何意义。我试过阅读Gradle文档,但没有发现任何引用我想要做的事情。
答案 0 :(得分:6)
可接受的答案仅是解决此问题的推荐方法。但是,现在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)
}
在使用方(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'
}
这样,您就可以解耦输出的产生方式,发布变体(称为“ taskB变体”)成为projectA
和projectB
之间的接口。因此,只要您更改输出的创建方式,只要确保输出以projectB
配置结束,就只需重构projectA
而不重构taskElements
。
目前,这仍然很冗长,但希望Gradle将来会获得更强大的API来描述这种项目关系。
答案 1 :(得分:4)
projectA build.gradle应为:
<img src="//placehold.it/2500x1500/00aa00/ffffff?text=sample image">