Я должен написать плагин для компиляции файлов определенного типа, не охватываемых существующим плагином.
Мои первоначальные требования заключаются просто в том, что если входной файл изменяется или отсутствует вывод, то задачабудет не быть актуальным.Другими словами, я хочу, чтобы базовая парадигма «работа с файлами» работала на меня.
Моя первая попытка была объявить как inputs
, так и outputs
, чтобы увидеть, будет ли проект работать так, как многие ожидают.
class TestPlugin implements Plugin<Project> {
void apply (Project project) {
project.task('compile') {
doFirst {
inputs.files.eachWithIndex { inFilename, idx ->
def inFile = project.file(inFilename)
def outFilename = outputs.files[idx]
def outFile = project.file(outFilename)
logger.info "converting ${inFile} to ${outFile}"
outFile.append "something"
}
}
}
}
}
apply plugin: TestPlugin
compile {
inputs.file "test.in"
outputs.file "test.out"
}
И это так.На данный момент он делает все, что мне нужно, за исключением одного: я должен определить outputs
в соответствии с inputs
.Но определение выходных данных достаточно сложно, чтобы оправдать включение этой части кода в задачу плагина.
Моя следующая попытка состояла в том, чтобы попытаться получить задачу, чтобы определить ее outputs
, но она потерпела неудачу, потому что при заполнениивыводит "код выполняется, inputs
пусто и поэтому outputs
не добавляется.
class TestPlugin implements Plugin<Project> {
void apply (Project project) {
project.task('compile') {
inputs.files.each { outputs.files.add(it.replaceFirst(~/\.in$/, '.out')) }
doFirst {
inputs.files.eachWithIndex { inFilename, idx ->
def inFile = project.file(inFilename)
def outFilename = outputs.files[idx]
def outFile = project.file(outFilename)
logger.info "converting ${inFile} to ${outFile}"
outFile.append "something"
}
}
}
}
}
apply plugin: TestPlugin
compile { inputs.file "test.in" }
Вышеприведенный сбой с ошибкой" путь не может быть пустым ... ", вызванной индексированием пустого outputs
список (потому что inputs
пуст во время итерации внешнего блока задачи по inputs
.
Я попытался заполнить outputs
в Project.afterEvaluate и Project.beforeEvaluate, но ни одна из них не работала. Закрытие beforeEvaluateникогда не выполнялось. Закрытие afterEvaluate выполнялось, ну, после того, как проект был оценен, что означает, что он выполняется после того, как задание было установлено как обновленное или устаревшее, и поэтому оно бесполезно для того, что мне нужно.
Я также попробовал Project.configure
, но это тоже не сработало.
Затем я обнаружил ленивая конфигурация , но так как она инкубируется, я думаюЯ должен избегать этого.Я предполагаю, что плагины Java и C не используют инкубационные функции, и это заставляет меня задуматься о том, как эти плагины делают эквивалент ленивой конфигурации.
Затем я нашел Плагин Gradle для пользовательского языка но ответа нет.Однако в нем есть комментарий, побуждающий меня взглянуть на lot исходного кода gradle.Опять же, я не думаю, что мне нужно было бы заново изобретать колесо.
Наконец, если мне нужно подтолкнуть решение скомпилировать в doFirst
и не беспокоиться о декларировании выходных данных (и, таким образом, отказаться от задачи до-датность), так тому и быть.Мне просто нужно знать и двигаться дальше.
Для большего контекста я переношу сборку с ant
.Два занятия udemy.com, которые я взял, мне очень помогли, но они не пошли достаточно далеко, чтобы привести меня в уверенном направлении для решения поставленной проблемы.Я задал подобный вопрос одному из инструкторов и его сообществу, но безрезультатно.