Eu tenho um script de compilação do Gradle ( build.gradle
), no qual criei algumas tarefas. Essas tarefas consistem principalmente em chamadas de método. Os métodos chamados também estão no script de construção.
Agora, esta é a situação:
Estou criando uma boa quantidade de scripts de construção, que contêm tarefas diferentes, mas utilizam os mesmos métodos do script original. Portanto, gostaria de extrair esses "métodos comuns" de alguma forma, para que possa reutilizá-los facilmente em vez de copiá-los para cada novo script que criar.
Se o Gradle fosse PHP, algo como o seguinte seria o ideal:
//script content
...
require("common-methods.gradle");
...
//more script content
Mas é claro, isso não é possível. Ou é?
Enfim, como posso alcançar esse resultado? Qual é o melhor método possível para fazer isso? Já li a documentação do Gradle, mas não consigo determinar qual método será o mais fácil e mais adequado para isso.
Desde já, obrigado!
ATUALIZAR:
Consegui extrair os métodos em outro arquivo
(usando apply from: 'common-methods.gradle'
),
então a estrutura é a seguinte:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
Depois de executar uma tarefa de build.gradle
, me deparei com um novo problema: aparentemente, os métodos não são reconhecidos quando estão emcommon-methods.gradle
.
Alguma ideia de como consertar isso?
fonte
timestamp()
oucurrentWorkingDirectory()
métodos comotask
-s (por exemplo). Funções utilitárias e coisas semelhantes são nominalmente escalares - elas não seriam tarefas, exceto pelo fato de que há limitações na reutilização de código embutida no Gradle e na maioria dos sistemas de construção. Gosto do mundo DRY, onde posso fazer uma coisa UMA vez e reutilizá-la. Na verdade, estendendo o exemplo de @Pieter VDE, eu também uso umroot.gradle
padrão " " para meu projeto pai - O arquivo build.gradle geralmente define alguns detalhes do projeto e entãoapply ${ROOT}
...Respostas:
Não é possível compartilhar métodos, mas você pode compartilhar propriedades extras contendo um closure, que se resume na mesma coisa. Por exemplo, declare
ext.foo = { ... }
incommon-methods.gradle
, useapply from:
para aplicar o script e chame o encerramento comfoo()
.fonte
File foo(String f)
se tornaráext.foo = { f -> ... }
, posso então fazer algo comoFile f = foo(...)
:?Com base na resposta de Peter , é assim que exporto meus métodos:
Conteúdo de
helpers/common-methods.gradle
:// Define methods as usual def commonMethod1(param) { return true } def commonMethod2(param) { return true } // Export methods by turning them into closures ext { commonMethod1 = this.&commonMethod1 otherNameForMethod2 = this.&commonMethod2 }
E é assim que uso esses métodos em outro script:
// Use double-quotes, otherwise $ won't work apply from: "$rootDir/helpers/common-methods.gradle" // You can also use URLs //apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle" task myBuildTask { def myVar = commonMethod1("parameter1") otherNameForMethod2(myVar) }
Aqui está mais informações sobre como converter métodos em fechamentos no Groovy.
fonte
ext
.Usando o dsl Kotlin , funciona assim:
build.gradle.kts :
external.gradle.kts :
fonte
Outra abordagem para Kotlin DSL poderia ser:
my-plugin.gradle.kts
settings.gradle.kts
fonte