projectA
我在创建文件的项目(我们称之为)构建脚本中有一个简单的自定义任务。任务如下所示:
task createFile() {
def outputFile = rootProject.file("${buildDir}/tmp/outputFile.txt")
outputs.file(outputFile)
outputs.upToDateWhen { false }
doLast {
outputFile.parentFile.mkdirs()
outputFile.text = "Hello World"
}
}
该项目是多项目构建的一部分,我需要此任务生成的文件作为projectB
. 为了实现这一点,我在其中创建了一个配置projectB
和一个相应的依赖项:
configurations {
mySourceConfig
}
dependencies {
mySourceConfig project(path: ':projectA', configuration: 'myDistConfig')
}
task copySourceDependencies(type: Copy) {
from configurations.mySourceConfig
into contextDir
}
在projectA
我得到一个myDistConfig
配置并希望使用createFile
任务的输出文件作为这个配置的工件:
configurations {
myDistConfig
}
artifacts {
myDistConfig createFile
}
如果我这样做,gradle 会告诉我一个任务不能转换为ConfigurablePublishArtifact
:
> Cannot convert the provided notation to an object of type ConfigurablePublishArtifact: task ':projectA:createFile'. The following types/formats are supported: - Instances of ConfigurablePublishArtifact. - Instances of PublishArtifact. - Instances of AbstractArchiveTask, for example jar. - Instances of Provider<RegularFile>. - Instances of Provider<Directory>. - Instances of Provider<File>. - Instances of RegularFile. - Instances of Directory. - Instances of File. - Maps with 'file' key
所以我尝试createFile.outputs.files.singleFile
作为神器。这会阻止 gradle 抱怨,但无法设置 and 之间的依赖关系:projectB:copySourceDependencies
,:projectA:createFile
如果projectB:copySourceDependencies
在干净的工作空间上执行,它会简单地跳过 status NO-SOURCE
。
是否有可能以某种方式使用自定义任务作为类似于 Zip 任务的工件,以使 gradle 了解依赖关系?!
2020-02-28 更新:
基于@BjørnVester 的非常好的回答,我在一个单独的 gradle 文件中实现了以下任务util.gradle
:
class CreateFile extends DefaultTask {
@OutputFile
RegularFileProperty outputFile = project.objects.fileProperty()
@TaskAction
void createFile() {
def tOutFile = outputFile.get().asFile
tOutFile.parentFile.mkdirs()
tOutFile.text = "Hello World"
}
}
rootProject.ext.CreateFile = CreateFile
在 projectA 中,build.gradle
它看起来像这样:
apply from 'util.gradle'
task createFile(type: CreateFile) {
outputFile = rootProject.file("${buildDir}/tmp/outputFile.txt")
}
artifacts {
myDistConfig createFile.outputFile
}
现在 gradle 知道正确的依赖关系,它就像一个魅力!