Gradle
Introducció
Section titled “Introducció”Instal.la gradle amb {% link “/tool/scoop/” %}:
> scoop install gradle
Tens un projecte “demo” a https://gitlab.com/xtec/kotlin/gradle
Obre un terminal de {% link “/windows/powershell/” %}
Verifica que gradle
està instal.lat:
> gradle
Welcome to Gradle 8.10.1.
Directory 'C:\Users\david' does not contain a Gradle build.
Crea la carpeta gradle
i entra dins la carpeta
> md gradle> cd gradle
Executa gradle init
amb els paràmetres que es mostren a continuació per generar una aplicació Kotlin amb el nom gradle
:
gradle init --package gradle --project-name gradle --java-version 21 --type kotlin-application --dsl kotlin --test-framework kotlintest --no-split-project --no-incubating --overwrite
Pots veure que s’han creat diferents fitxers:
> ls
Directory: C:\Users\david\gradle
Mode LastWriteTime Length Name---- ------------- ------ ----d----- 4/10/2024 8:23 appd----- 4/10/2024 8:23 gradle-a---- 4/10/2024 8:23 290 .gitattributes-a---- 4/10/2024 8:23 108 .gitignore-a---- 4/10/2024 8:23 8762 gradlew-a---- 4/10/2024 8:23 2966 gradlew.bat-a---- 4/10/2024 8:23 535 settings.gradle.kts
Gradle Wrapper
Section titled “Gradle Wrapper”Al crear el projecte s’ha creat la carpeta gradle:
> ls .\gradle\wrapper\
Directory: C:\Users\david\gradle\gradle\wrapper
Mode LastWriteTime Length Name---- ------------- ------ -----a---- 4/10/2024 8:40 43583 gradle-wrapper.jar-a---- 4/10/2024 8:40 253 gradle-wrapper.properties
Aquesta carpeta té el fitxer JAR i la configuració del Gradle Wrapper.
Aquesta aplicació s’executa amb el fitxer gradlew.bat
(per Windows) o gradlew
(per macOs i Linux).
El “Gradle Wrapper” utilitza una versió concreta de Gradle, i si aquesta versió no està a l’ordinador, la baixa directament d’Internet.
D’aquesta manera qualsevol usuari que treballa amb el projecte utilitzarà la mateixa versió de Gradle, encara que no tingui instal.lat Gradle a l’ordinador.
Projecte
Section titled “Projecte”La configuració del projecte està en el fitxer settings.gradle.kts
.
Si mires el contingut del fitxer pots veure que el nom del projecte és “gradle” i que inclou el subprojecte “app”:
> gc .\settings.gradle.kts
rootProject.name = "gradle"include("app")
Un projecte es composa de 1 o més subprojectes.
Quan has executat l’ordre gradle init
, has dit que volies crear una aplicació Kotlin mitjançant el paràmetre --type kotlin-application
.
En la carpeta app
està el codi del teu subprojecte:
> ls .\app\
Directory: C:\Users\david\gradle\app
Mode LastWriteTime Length Name---- ------------- ------ ----d----- 4/10/2024 9:09 src-a---- 4/10/2024 9:09 1409 build.gradle.kts
En aquesta carpeta tens:
- El fitxer
build.gradle.kts
que té la configuració del subprojecte “app” - La carpeta
src
on està tot el codi del projecte.
Executa aquesta ordre per executar la tasca build
:
> .\gradlew build
BUILD SUCCESSFUL in 4s7 actionable tasks: 7 executed
Observació. Powershell executa l’script gradlew.bat
encara que no posis .bat
al final.
La primera vegada que executes el “wrapper”, el “wrapper” baixa i guarda en cache els binaris Gradle si aquests no estan instal.lats a l’ordinador.
La tasca build
utlitza el codi font i les seves dependències per construit l’aplicació.
Si executes l’ordre ls
pots veure que s’han creat dos carpetes noves: .gradle
i .kotlin
.
> ls
Directory: C:\Users\david\gradle
Mode LastWriteTime Length Name---- ------------- ------ ----d----- 4/10/2024 8:54 .gradled----- 4/10/2024 8:54 .kotlind----- 4/10/2024 8:54 appd----- 4/10/2024 8:51 gradle-a---- 4/10/2024 8:51 290 .gitattributes-a---- 4/10/2024 8:51 108 .gitignore-a---- 4/10/2024 8:51 8762 gradlew-a---- 4/10/2024 8:51 2966 gradlew.bat-a---- 4/10/2024 8:51 535 settings.gradle.kts
En la carpeta .gradle
tens una instal.lació local de Gradle que es la que utilitza el projecte mitjançant l’script gradlew
.
A més, la tasca build
també ha generat la carpeta app\build
:
> ls .\app\build\
Directory: C:\Users\david\gradle\app\build
Mode LastWriteTime Length Name---- ------------- ------ ----d----- 4/10/2024 8:23 classesd----- 4/10/2024 8:23 distributionsd----- 4/10/2024 8:23 kotlind----- 4/10/2024 8:23 libsd----- 4/10/2024 8:23 reportsd----- 4/10/2024 8:23 scriptsd----- 4/10/2024 8:23 test-resultsd----- 4/10/2024 8:23 tmp
En aquesta carpeta es guarda tot el que es genera a partir del codi que has escrit.
El fitxer app/build.gradle.kts
té configurat quina és la classe principal de l’aplicació:
application { mainClass = "gradle.AppKt"}
Aquesta classe está a la ruta /app/src/main/kotlin/gradle/App.kt
Amb la tasca run
pots executa l’aplicació:
> .\gradlew run
Hello World!
BUILD SUCCESSFUL in 2s2 actionable tasks: 1 executed, 1 up-to-date
Obre el fitxer App.kt
amb el “bloc de notes” del Windows:
notepad.exe .\app\src\main\kotlin\gradle\App.kt
Modifica el contingut del fitxer:
package gradle
fun main() { println("Hello World!")}
Torna a executar l’aplicació:
> gradle run
Hello World!
BUILD SUCCESSFUL in 1s
A continuació anem a crear un test.
Mofifica el fitxer AppTest.kt
que està en la carpeta app/src/test/kotlin/gradle/AppTest.kt
.
> notepad.exe .\app\src\test\kotlin\gradle\AppTest.kt
Crea un test que no funciona:
package gradle
import kotlin.test.*
class AppTest { @Test fun myTest() {
assertEquals(3, 5) }}
Amb la tasca test
verifica que no funciona:
> gradle test
AppTest > myTest() FAILED org.opentest4j.AssertionFailedError at AppTest.kt:8
1 test completed, 1 failed
FAILURE: Build failed with an exception.
* What went wrong:Execution failed for task ':app:test'.> There were failing tests. See the report at: file:///C:/Users/david/gradle/app/build/reports/tests/test/index.html
* Try:> Run with --scan to get full insights.
BUILD FAILED in 1s3 actionable tasks: 1 executed, 2 up-to-date
El resultat és que at AppTest.kt:8
… 😮, 3 no és igual a 5 😇
Obre en el navegador la URL file:///...
i tens un “report” més bonic.
{% image “test-report.png” %}
Modifica l’asserEquals
perquè el test funcioni:
{% sol %}
package gradle
import kotlin.test.*
class AppTest { @Test fun myTest() {
assertEquals(5, 5) }}
{% endsol %}
Verifica que funciona:
> gradle test
BUILD SUCCESSFUL in 1s3 actionable tasks: 2 executed, 1 up-to-date
Dependències
Section titled “Dependències”Un projecte necessita moltes funcionalitats que no estan a les biblioteques estàndards.
Per exemple, si vull crear gràfics puc utilitzar la biblioteca Kandy.
En el fitxer build.gradle.kts
del subprojecte “app” pots declarar dependències.
Modifica l’entrada dependencies
i afegeix una dependència amb “Kandy”:
dependencies {
// ...
implementation("org.jetbrains.kotlinx:kandy-lets-plot:0.7.0")}
Modifica el fitxer App.kt
per crea un diagrama de barres:
package gradle
import org.jetbrains.kotlinx.dataframe.api.*import org.jetbrains.kotlinx.kandy.dsl.*import org.jetbrains.kotlinx.kandy.letsplot.export.saveimport org.jetbrains.kotlinx.kandy.letsplot.layers.bars
fun main() { val averageTemperature = dataFrameOf( "city" to listOf("New York", "London", "Berlin", "Yerevan", "Tokyo"), "average temperature" to listOf(12.5, 11.0, 9.6, 11.5, 16.0) )
averageTemperature.plot { bars { x("city") y("average temperature") { axis.name = "Average Temperature (°C)" } } }.save("plot.png", path = ".")}
Executa l’aplicació:
> .\gradlew run
BUILD SUCCESSFUL in 3s2 actionable tasks: 1 executed, 1 up-to-date
Obre el fitxer app\plot.png
que s’acaba de crear:
> mspaint.exe .\app\plot.png
Plugins
Section titled “Plugins”Gradle s’estructura al voltat de “plugins” que afegeixen funcionalitat.
Per exemple, si vols crear una distribució del teu projecte has d’afegir el “plugin” application
.
Com que a l’inici has dit que el projecte és de tipus kotlin-application
, en la secció plugins
del fitxer build.gradle.kts
del subprojecte “app” ja s’ha declarat el plugin:
Si executes la tasca distZip
per crear una distribuxió del teu projecte:
> gradle distZipBUILD SUCCESSFUL in 2s4 actionable tasks: 3 executed, 1 up-to-date
En el “path” app/build/distributions/
està el fitxer:
> ls .\app\build\distributions\
Directorio: C:\Users\david\gradle\app\build\distributions
Mode LastWriteTime Length Name---- ------------- ------ -----a---- 09/10/2024 17:08 4551293 app.zip
Descomprimeix el fitxer a la carpeta dist
:
> Expand-Archive -Path .\app\build\distributions\app.zip dist
Ja pots executar l’aplicació directament:
> .\dist\app\bin\app...
I, si elimines el plugin application
del fitxer build.gradle.kts
la tasca distZip
desapareixerà:
> gradle distZip
Configure project :appe: file:///C:/Users/ddemingo/gradle/app/build.gradle.kts:41:1: Expression 'application' cannot be invoked as a function. The function 'invoke()' is not found...
Wrapper
Section titled “Wrapper”https://docs.gradle.org/current/userguide/gradle_wrapper.html
The following command upgrades the Wrapper to the latest
version:
> ./gradlew wrapper --gradle-version latest
The following command upgrades the Wrapper to a specific version:
$ ./gradlew wrapper --gradle-version 8.11
BUILD SUCCESSFUL in 4s1 actionable task: 1 executed
Once you have upgraded the wrapper, you can check that it’s the version you expected by executing ./gradlew --version
.
Don’t forget to run the wrapper
task again to download the Gradle distribution binaries (if needed) and update the gradlew
and gradlew.bat
files.