在Gradle

时间:2016-01-19 21:57:11

标签: gradle

考虑以下设置

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文档,但没有发现任何引用我想要做的事情。

2 个答案:

答案 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变体”)成为projectAprojectB之间的接口。因此,只要您更改输出的创建方式,只要确保输出以projectB配置结束,就只需重构projectA而不重构taskElements

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

答案 1 :(得分:4)

projectA build.gradle应为:

<img src="//placehold.it/2500x1500/00aa00/ffffff?text=sample image">