Итак, я поигрался с kotlin dsl от Gradle, и мой buildscript вырос до такой степени, что я хотел представить пользовательские задачи для лучшей организации.
Вот MWE моегоbuild.gradle.kts
:
open class CustomTask : DefaultTask() {
var dir = File(".")
@TaskAction
fun action() {
println("CustomTask.dir: ${dir.absolutePath}")
}
}
tasks.create<CustomTask>("debug") {
//dir = File(".gradle") // Script compilation fails if I uncomment this line
}
tasks.create("traverseDir") {
doLast {
traverseDir(File("gradle/wrapper/gradle-wrapper.jar"))
}
}
fun traverseDir(file: File) {
var dir: File? = file.parentFile
while (dir != null) {
println(dir)
dir = dir.parentFile
}
}
Вывод ./gradlew debug traverseDir
без конфигурации задачи (имеется в виду назначение dir с комментариями):
> Task :debug
CustomTask.dir: /home/.../gradle-kotlin_dsl-smart_cast_error/.
> Task :traverseDir
gradle/wrapper
gradle
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
Вывод ./gradlew debug traverseDir
с настройкой задачи (имеется в виду назначение dir без комментариев)):
> Configure project :
e: /home/.../gradle-kotlin_dsl-smart_cast_error/build.gradle.kts:32:11: Smart cast to 'File' is impossible, because 'dir' is a local variable that is captured by a changing closure
FAILURE: Build failed with an exception.
* Where:
Build file '/home/.../gradle-kotlin_dsl-smart_cast_error/build.gradle.kts' line: 32
* What went wrong:
Script compilation error:
Line 32: dir = dir.parentFile
^ Smart cast to 'File' is impossible, because 'dir' is a local variable that is captured by a changing closure
1 error
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 0s
Эти две задачи не связаны друг с другом (кроме тех, которые определены в одном и том же файле buildscript), но когда я пытаюсь настроить экземпляр моей пользовательской задачи (то есть раскомментировать dir = ...
строка) сборка завершается неудачно из-за ошибки компиляции скрипта в - казалось бы, не связанной - функции traverseDir.
Дальнейшие странности:
- Ошибка не возникает, если я переименую любойпеременные
dir
(то есть dir_
) - тогда сборка завершается успешно. - Изменение строки
dir = dir.parentFile
на dir = dir?.parentFile
делает сборку успешной.
ПочемуTего случилось?
Вывод ./gradlew --version
:
------------------------------------------------------------
Gradle 4.10
------------------------------------------------------------
Build time: 2018-08-27 18:35:06 UTC
Revision: ee3751ed9f2034effc1f0072c2b2ee74b5dce67d
Kotlin DSL: 1.0-rc-3
Kotlin: 1.2.60
Groovy: 2.4.15
Ant: Apache Ant(TM) version 1.9.11 compiled on March 23 2018
JVM: 1.8.0_181 (Oracle Corporation 25.181-b13)
OS: Linux 4.15.0-33-generic amd64
Обновление :
Это похоже на ошибкуЯ создал проблемы: