Я пытаюсь реализовать gradle
плагин в kotlin
, которая будет поддерживать структуру как этогоделегата вложенного закрытие invokation к соответствующему классу
env {
app ("ghc-haskell") {
srcLink { "http://downloads.haskell.org/~ghc/8.0.1/ghc-8.0.1-x86_64-unknown-mingw32.tar.xz" }
downloadPath { project(':').projectDir.absolutePath + "\\applications\\plugin" }
installPath { project(':').projectDir.absolutePath + "\\applications\\plugin" }
}
}
Но у меня есть проблемы с внутренними затворами, как srcLink
, downloadPath
, installPath
. Как делегировать свою инкакацию соответствующему классу kotlin
?
Мое расширение выглядит следующим образом
/**
* Keeps all environments.
*/
open class ApplicationEnvironmentContainerExtension {
val environs = mutableMapOf<String, ApplicationEnvironmentExtension>()
fun app(id: String, closure : ApplicationEnvironmentContainerExtension.() -> String) : ApplicationEnvironmentExtension {
val extension = ApplicationEnvironmentExtension()
extension.installationId = id
environs.put(id, extension)
return extension
}
/**
* Sub extension.
*/
open class ApplicationEnvironmentExtension {
var installationId = ""
var srcLink = ""
var downloadPath = ""
var installPath = ""
fun srcLink(closure: ApplicationEnvironmentExtension.() -> String) {
srcLink = closure()
}
fun downloadPath(closure: ApplicationEnvironmentExtension.() -> String) {
downloadPath = closure()
}
fun installPath(closure: ApplicationEnvironmentExtension.() -> String) {
installPath = closure()
}
override fun toString(): String {
return "ApplicationEnvironmentExtension(" +
"installationId='$installationId', " +
"srcLink='$srcLink', " +
"downloadPath='$downloadPath', " +
"installPath='$installPath')"
}
}
}
И когда я призываю мою print
задачу, чтобы отобразить список окрестностей он показывает набор только installationId
- другие поля пустые
open class PrintingTask : DefaultTask() {
@TaskAction
fun print() {
val extension = this.project.extensions.getByName("env") as ApplicationEnvironmentContainerExtension
extension.environs.forEach {
println(it.value)
}
}
}
Как делегировать closure
invokation в ApplicationEnvironmentExtension
?
В этом случае она возвращает 'Не удалось найти метод srcLink() для аргументов [build_7r01ofigr1pt144ypsds3y84p $ _run_closure2_closure5_closure7 @ 718989fa]' – lapots
Что вы имеете в виду «возвращает»? Это ошибка компиляции или исключение, возникшее во время выполнения? – marstran
во время выполнения. Когда я пытаюсь запустить некоторые задачи из своего плагина – lapots