Миграция Groovy gradle до градиента Kotlin (исключение отсутствующего или закрытие, не уверен)

У меня есть помощник Git, написанный в хорошем смысле слова:

git.gradle:

def gitHash() { def res = 'git rev-parse --short HEAD'.execute([], project.rootDir).text.trim() def diff = 'git diff'.execute([], project.rootDir).text.trim() if (diff != null && diff.length() > 0) { res += "-dirty" } return res } // method needs to be converted to closure, in order to be visible outside of script ext.gitHash = { return gitHash();} 

Теперь я превратил целые вещи в Котлин, теперь выглядит так:

git.gradle.kts:

 import java.io.IOException import java.util.concurrent.TimeUnit fun gitHash() : String { var res = "git rev-parse --short HEAD".runCommand(project.rootDir)?.trim() val diff = "git diff".runCommand(project.rootDir)?.trim() if (diff != null && diff.isNotEmpty()) { res += "-dirty" } return res!! } fun String.runCommand(workingDir: File): String? { ... } // method needs to be converted to closure, in order to be visible outside of script //ext.gitHash = { return gitHash();} // <-- HERE'S THE PROBLEM task("gitTask") { // <-- calling ./gradlew gitTask works println(gitHash()) } 

Основной сценарий включает в себя следующие:

 //apply from: 'git.gradle' apply from: 'git.gradle.kts' println gitHash() // works with Groovy, doesn't with Kotlin 

Теперь проблема заключается в том, что основной скрипт не может распознать метод gitHash (), скорее всего, потому что я не могу разоблачить его через закрытие ext. То же, что и в скрипте Groovy, этот метод кажется закрытым (или локальным) в этом файле.

Насколько я понимаю, ext закрытие – это сокращение от project.extra, которое я пытался интегрировать. Кроме того, похоже, что типичное закрытие Groovy не имеет эквивалента в Котлине. Я застрял здесь, не зная, что еще я могу попробовать. Любые идеи приветствуются.

ОБНОВИТЬ

С:

 var gitHash: Closure<Any?> by extra gitHash = closureOf<String> { } gitHash.delegate = { gitHash() } 

Я могу работать с ним в Groovy, как:

 println gitHash.invoke() 

Но это не работает с скриптом Kotlin … потому что invoke () указывает на вызов () ( https://github.com/gradle/gradle-script-kotlin/blob/master/src/main/kotlin/org/ gradle / script / lang / kotlin / GroovyInteroperability.kt ). И хотя я пытаюсь использовать его в качестве закрытия gitHash() это приводит к такой ошибке:

 Parameter specified as non-null is null: method org.gradle.script.lang.kotlin.KotlinClosure.doCall, parameter it 

Похоже, я что-то пропустил …

Intereting Posts
Захват изображений и видео, таких как рассказы Snapchat / Instagram Котлин: Подавить неиспользуемое имущество? Какова цель возврата единиц в функции Невозможно скомпилировать проект с использованием Gradle и Kotlin Код Vertx Sync работает несколько раз Правильный способ вставки кинжала 2 + Kotlin + ViewModel Не удалось получить групповое сообщение, используя smack Glide onLoadFailed () триггер после загрузки всего изображения после прокрутки вниз, а затем прокрутки вверх Новое для Kotlin..have проблемы с опциями и литьем Может ли Kotlin разрешить функцию, возвращающую значение типа реализации этого интерфейса? как указать порядок плагина компилятора maven notifyDataSetChanged () не вызывает метод onBindViewHolder () Могу ли я указать тип свойства в делегате? Kotlin: обходной путь для no lateinit при использовании настраиваемого сеттера? kotlin неразрешенная ссылка KDoc, но IntelliJ не любит импорт, который его исправляет