将Groovy gradle移植到Kotlin gradle(ext缺少或闭包转换,不确定)

我有一些Git帮手写在groovy:

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();} 

现在我把整个东西转换成Kotlin,现在看起来像这样:

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 closure是我正在尝试整合的“project.extra”的缩写。 另外,似乎典型的Groovy关闭在Kotlin中没有相同的地方。 我卡在这里,不知道还有什么可以尝试。 任何想法欢迎。

UPDATE

附:

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

我可以在Groovy中使用它,例如:

 println gitHash.invoke() 

但它不适用于Kotlin脚本…因为invoke()指向call()( 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 

它看起来像我失去了一些东西…