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

Mic*_* Wu 4 gradle

考虑以下设置

rootProject
|--projectA
|--projectB
Run Code Online (Sandbox Code Playgroud)

中有一个任务taskBprojectB我希望在中的复制任务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文档,但没有找到任何引用我正在尝试做的事情。

bri*_*ter 9

公认的答案只是解决该问题的推荐方法。但是,现在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变”)成为之间的接口projectAprojectB。因此,无论何时更改创建输出的方式,您都只需重构,projectB而无需projectA确保您的输出最终保存在taskElements配置中。

目前,它仍然很冗长,但希望Gradle将来会获得更强大的API,以描述这种项目关系。


RaG*_*aGe 5

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)