引用Gradle中另一个项目中任务的输出

引用Gradle中另一个项目中任务的输出,gradle,Gradle,考虑以下设置 rootProject |--projectA |--projectB 在projectB中有一个任务taskB,我希望在projectA中的复制任务taskA中引用该任务的输出。例如,taskA可能看起来像: task taskA(type: Copy) { dependsOn ':projectB:taskB' from ':projectB:taskB.outputs' into 'someFolder' } 当然,上面的例子实际上不起

考虑以下设置

rootProject
|--projectA
|--projectB
projectB
中有一个任务
taskB
,我希望在
projectA
中的复制任务
taskA
中引用该任务的输出。例如,
taskA
可能看起来像:

task taskA(type: Copy) {    
    dependsOn ':projectB:taskB'

    from ':projectB:taskB.outputs'

    into 'someFolder'
}

当然,上面的例子实际上不起作用。虽然可以将任务作为依赖项引用为
:projectB:taskB
:projectB:taskB.outputs
对Gradle来说似乎没有任何意义。我已尝试阅读Gradle文档,但没有找到任何引用我尝试执行的操作的内容。

projectA build.Gradle应该是:

evaluationDependsOn(':projectB')

task taskA(type:Copy, dependsOn:':projectB:taskB'){
    from tasks.getByPath(':projectB:taskB').outputs
    into 'someFolder'
}

公认的答案是,只有一种建议的方法可以解决这个问题。然而,Gradle团队现在不鼓励建立这种项目依赖关系并从一个项目进入另一个项目。与此相反,项目应该只使用发布变体彼此交互。因此,惯用的(但遗憾的是,目前更为冗长)方式是:

在生产端(
projectB
)定义一个不可解析但可供其他项目使用的配置,并创建一个新的变量(称为
taskB variant

在消费端(
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'
}
val taskOutputs by configurations.creating{
isCanBeResolved=true
isCanBeConsumed=false
属性{
属性(Usage.Usage_属性,project.objects.named(Usage::class,“taskB变量”))
}
}
依赖关系{
任务输出(项目(“:项目B”))
}
任务。注册(“任务A”){
从任务输出
进入“someFolder”
}
通过这种方式,您可以解耦输出的生成方式,发布变量(称为“taskB variant”)成为
projectA
projectB
之间的接口。因此,无论何时更改创建输出的方式,只要确保输出最终位于
任务元素
配置中,就只需重构
projectB
,而不必重构
projectA


目前,这仍然非常冗长,但希望Gradle将来能够获得更强大的API来描述这种项目关系。

尝试
tasks(':projectB:taskB')。outputs
尝试了这一点,并在配置时抛出错误。还尝试了使用
task(…)
但似乎没有任何效果我了解到,您可以使用
evaluationDependsOn(:projectB)
使
projectA
依赖于已配置的
projectB
。然后您可以执行类似于
rootProject.project('projectB').tasks.getByName('taskB')的操作。输出
稍微简单一点,您还可以执行:
tasks.getByPath(':projectB:taskB')。输出
yup。这基本上就是我最终要做的!谢谢你的解释。这当然更为冗长,但其意图对我来说是有意义的似乎指定一个变体并不是必需的。
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'
}