A documentação da API Gradle Project
afirma que é possível adicionar um método dinâmico a um projeto
Uma propriedade do projeto cujo valor é um encerramento. O encerramento é tratado como um método e chamado com os parâmetros fornecidos. A propriedade está localizada conforme descrito acima.
Acho que "descrito acima" significa que é possível usar propriedades dinâmicas do projeto. Eles são descritos na documentação da API como
Um projeto possui 5 'escopos' de propriedades, nos quais ele procura propriedades. Você pode acessar essas propriedades pelo nome em seu arquivo de construção ou chamando o método property(String) do projeto. Os escopos são:
...
- As propriedades extras do projeto. Cada projeto mantém um mapa de propriedades extras, que pode conter qualquer par arbitrário de nome -> valor. Uma vez definidas, as propriedades deste escopo são legíveis e graváveis. Veja propriedades extras para mais detalhes.
Então pensei que poderia escrever um plugin de convenção, por exemplo, "sayHello.gradle.kts"
// sayhello.gradle.kts
val sayHello : (String) -> Unit = { who ->
println("Hello $who")
}
ext.set("sayHello", sayHello)
e então use a função (ou lambda) que adicionei ao projeto em outrobuild.gradle.kts
// Some projects build.gradle.kts
plugins {
id("sayHello")
}
sayHello("René")
Mas estou conseguindo
Script compilation errors:
Line 7: sayHello("")
^ Expression 'sayHello' cannot be invoked as a function. The function 'invoke()' is not found
Line 7: sayHello("")
^ Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public val TaskContainer.sayHello: TaskProvider<DefaultTask> defined in org.gradle.kotlin.dsl
Achei que estava errado com o DSL Kotlin e li a seção Propriedades Extras , mas isso mostra apenas como os valores são registrados e não os fechamentos.
Porém tentei registrar um fechamento semelhante aos valores do exemplo. Então eu fiz:
val sayHelloFun : (String) -> Unit = { who ->
println("Hello $who")
}
val sayHello by extra(sayHelloFun)
Eu recebi a mesma mensagem de erro.
Alguém sabe como adicionar uma função personalizada a um Project
plugin de convenção usando Kotlin DSL?