У меня есть простая пользовательская задача в сценарии сборки проекта (назовем это 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 от жалоб, но не может установить зависимость между :projectB:copySourceDependencies
и :projectA:createFile
, и если projectB:copySourceDependencies
выполняется в чистой рабочей области, он просто пропускается со статусом 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 знает о правильных зависимостях и работает как шарм!