Gradle

Intro

БистСма Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ сборки. Π‘ΠΊΡ€ΠΈΠΏΡ‚Ρ‹ β€” это dsl Π½Π° Groovy ΠΈΠ»ΠΈ Kotlin. НС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Android ΠΈ jvm, Π½ΠΎ ΠΈ для native (C++, swift) ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ.

Youtube запись ΠΎΡ‚ Redmadrobot: https://www.youtube.com/watch?v=WOBok2u-SL8

ДокумСнтация ΠΎΡ‚ Kotlin ΠΏΠΎ использованию Gradle для сборки kotlin-прилоТСния: https://kotlinlang.org/docs/gradle.html

Мой ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я собирал kotlin multiplatform Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ для Π²Π΅Π±-сСрвСра ΠΈ Π°Π½Π΄Ρ€ΠΎΠΈΠ΄ прилоТСния с использованиСм ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° buildSrc ΠΈ синтаксиса Kotlin DSL для gradle: https://github.com/IkeMurami-Examples/KotlinMultiplatformExample

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ multiplatform ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²: https://kotlinlang.org/docs/multiplatform-mobile-samples.html

Install

releases: https://gradle.org/releases/

Π‘ΠΊΠ°Ρ‡ΠΈΠ²Π°Π΅ΠΌ Π±ΠΈΠ½Π°Ρ€ΠΈ, ΠΊΠ»Π°Π΄Π΅ΠΌ Π² ΠΏΠ°ΠΏΠΊΡƒ, ΠΈ прописываСм ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ ΠΏΠ°ΠΏΠΊΠΈ bin Π² PATH.

gradle -v

Update gradle

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ gradle, Π½Π°Π΄ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ для зависимости com.android.tools.build:gradle.

build.gradle:

buildscript {
    ext {
        gradle_version = "7.1.2"
    }

    repositories {
        google()
    }
    
    dependencies {
        classpath "com.android.tools.build:gradle:${gradle_version}"
    }
}

Π’ΠΎΡ‚ здСсь ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ вСрсии доступны Π² google maven Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (google()): https://mvnrepository.com/artifact/com.android.tools.build/gradle-api?repo=google

Π•ΡΡ‚ΡŒ Π΄Π²Π° способа ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ gradle:

  • Android Studio: File > Project Structure > ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ Gradle ΠΈΠ· Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅Π³ΠΎ списка. НуТная вСрсия Gradle сразу подтянСтся

  • Terminal:

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΏΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ вСрсии
$ gradle help --scan
$ gradle --version

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄ΠΎ 7.0:
$ gradle wrapper --gradle-version 7.0

Basics

  • Бостоит ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² (ΠΎΠ½ΠΈ ΠΆΠ΅ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ модулями, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ)

  • ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сколь ΡƒΠ³ΠΎΠ΄Π½ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ структуры

root_project/
   sub-project-1/
      build.gradle
   sub-project-2/
      one-more-sub-project/
         build.gradle
      build.gradle
   sub-project-3/
      build.gradle
   build.gradle
   settings.gradle

settings.gradle β€” здСсь описаны всС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹:

rootProject.name = "Root Project"
include("sub-project-1")
include("sub-project-2")
include("sub-project-3")
include("sub-project-2:one-more-sub-project")

Tasks ΠΈ Projects

  • Π­Ρ‚ΠΎ основныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π² Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Gradle

  • Васк β€” основная Π΅Π΄ΠΈΠ½ΠΈΡ†Π° выполнСния Π² Gradle.

  • Васки ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π²ΠΈΡΠ΅Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ таска (Π½Π° Kotlin DSL):

tasks.register("hello") {
    doFirst {
        // Some actions β€” Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΏΡ€ΠΈ запускС таска
        println("Hello world!")
    }
    println("Action in Configuration State") // Π­Ρ‚ΠΎ дСйствиС Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° стадии ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
    doLast {
        // Some actions β€” Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ ΠΏΡ€ΠΈ запускС таска
        println("Hello world!")
    }
}

Task configuration

  • doFirst() ΠΈ doLast() β€” дСйствия, ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅ΠΌΡ‹Π΅ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ выполСнСния таска

  • description β€” описаниС таска

  • group β€” имя Π³Ρ€ΡƒΠΏΠΏΡ‹ тасков

  • extra properties

Task actions

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹Π΅ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @TaskAction, Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ запускС таска

  • Π£ таска ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько action'ΠΎΠ²

  • ВсС action'Ρ‹ хранятся Π² спискС ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΠΎ порядку

  • ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ doFirst ΠΈ doLast Π½Π° самом Π΄Π΅Π»Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ action'Ρ‹ Π² Π½Π°Ρ‡Π°Π»ΠΎ ΠΈΠ»ΠΈ ΠΊΠΎΠ½Π΅Ρ† списка

Incremental Tasks

НСкоторыС таски достаточно тяТСлыС, ΠΈ Π½Π΅Ρ‚ смысла ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ, Ссли ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»Π° ошибка ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ измСнСния Π² Ρ„Π°ΠΉΠ»Π°Ρ… Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… тасках. Π•ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ API, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ позволяСт Π½Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ таски, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΈΡΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния тасков

  • NO-SOURCE β€” таск Π½Π΅ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ нашлось Π΄Π°Π½Π½Ρ‹Ρ… для Π½Π΅Π³ΠΎ

  • SKIPPED β€” таск Π½Π΅ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡ‰Π΅Π½

    • Π±Ρ‹Π» явно Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½

      • Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -x)

      • Ρ‡Π΅Ρ€Π΅Π· свойство enabled=false

      • Ρ‡Π΅Ρ€Π΅Π· список excludedTaskNames

    • ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ΅Π» StopExecutionException

    • Ρƒ таска Π΅ΡΡ‚ΡŒ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ onlyIf {}, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Π΅Ρ€Π½ΡƒΠ» false

  • FROM-CACHE

    • ΠžΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния task'Π° Π±Ρ‹Π» взят ΠΈΠ· кэша

    • Π§Ρ‚ΠΎΠ±Ρ‹ gradle ΠΌΠΎΠ³ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ task, Π½Π°Π΄ΠΎ Π΅Π³ΠΎ явно ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ @CacheableTask

    • Gradle Π½Π° основС ΠΈΠΌΠ΅Π½ΠΈ класса, Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² сам вычисляСт ΠΊΠ»ΡŽΡ‡

    • Кэш ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ, Π½ΠΎ ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΌ, ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСсколькими машинами

  • UP-TO-DATE

    • старый ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π² gradle, ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ Π΄ΠΎ кэша

    • Task ΠΈΠΌΠ΅Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ измСнились

    • Task явно ΡƒΠΊΠ°Π·Π°Π» gradle, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π΅ измСнились (Ρ‡Π΅Ρ€Π΅Π· лямбду, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΡƒΡŽ Π² outputs.upToDateWhen{})

    • Π£ task'Π° Π½Π΅Ρ‚ action'ΠΎΠ² ΠΈ ΠΎΠ½ зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… task'ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ UP-TO-DATE, SKIPPED ΠΈΠ»ΠΈ FROM_CACHE

    • Π£ task'Π° Π½Π΅Ρ‚ Π½ΠΈ action'ΠΎΠ², Π½ΠΈ зависимостСй

  • (no label) or EXECUTED β€” Task ΠΈ Π΅Π³ΠΎ зависимости Π±Ρ‹Π»ΠΈ Π·Π°ΠΏΡƒΡ‰Π΅Π½Ρ‹

Как ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ зависимостями ΠΌΠ΅ΠΆΠ΄Ρƒ тасками

1

dependsOn() β€” Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Task Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… task'ΠΎΠ² (ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ список)

// Groovy DSL
task TaskA {
    doFirst { println "running TaskA" }
}

task TaskB {
    dependsOn "TaskA"
    doFirst { println "running TaskB" }
}

2

finalizedBy() β€” Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΎΠΉ послС Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ выполнится таск. Finalized task выполнится, Π΄Π°ΠΆΠ΅ Ссли Ρ‚ΠΎΡ‚, ΠΎΡ‚ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΎΠ½ зависит, Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ.

// Groovy DSL
task TaskC {
    doFirst { println "running TaskC" }
}

task TaskB {
    finlizedBy "TaskC"
    doLast { 
        println "running TaskB" 
        throw new RuntimeException("WTF")
    }
}

3

shouldRunAfter() ΠΈ mustRunAfter() β€” Π—Π°Π΄Π°ΡŽΡ‚ порядок выполнСния тасков Π±Π΅Π· явных зависимостСй ΠΌΠ΅ΠΆΠ΄Ρƒ Π½ΠΈΠΌΠΈ. Π“Π»Π°Π²Π½ΠΎΠ΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ dependsOn Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ Π²Π»ΠΈΡΡŽΡ‚ Π½Π° запуск тасков, Π° Π’ΠžΠ›Π¬ΠšΠž Π½Π° порядок.

// Groovy DSL
task TaskA {
    doFirst { println "running TaskA" }
}

task TaskB {
    doLast { println "running TaskB" }
}

TaskA.mustRunAfter TaskB // ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ TaskA Π±Π΅Π· TaskB ΠΈ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚ (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ)

shouldRunAfter() β€” порядок ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ (Ссли получился цикличСский порядок ΠΈΠ»ΠΈ ΠΏΡ€ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ)

mustRunAfter() β€” порядок тасков Π΄ΠΎΠ»ΠΆΠ΅Π½ выполнятся всСгда

4

Inputs and Outputs

  • ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Ссли task зависит ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, Ρ‚ΠΎ ΠΎΠ½ ΠΆΠ΄Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠΉ task.

  • Π’ gradle ΠΌΠΎΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ таска с Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ, ΠΏΡ€ΠΈ этом ΠΌΠΎΠΆΠ½ΠΎ явно Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ зависимости Ρ‡Π΅Ρ€Π΅Π· dependsOn.

Π’ ΠΊΠΎΠ΄Π΅ это выглядит ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ

def producer = tasks.register("producer", Producer)
def consumer = tasks.register("consumer", Consumer)

// БвязываСм Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» Ρ€Π°Π·Π½Ρ‹Ρ… тасков
// Зависимости ΠΌΠ΅ΠΆΠ΄Ρƒ тасками Π±ΡƒΠ΄ΡƒΡ‚ выставлСны автоматичСски
consumer.confugire {
    inputFile = producer.flatMap { it.outputFile }
}

Π€Π°Π·Ρ‹ сборки Gradle

  1. Initialization β€” Gradle провСряСт, ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΠ»Π΄Π΅ ΠΈ создаСт инстансы Project

  2. Configuration β€” Π—Π°ΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ всС скрипты build.gradle Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ таски ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², строится Π³Ρ€Π°Ρ„ тасков

  3. Execution β€” Gradle запускаСт таски Π² Π½ΡƒΠΆΠ½ΠΎΠΌ порядкС Π½Π° основС Π³Ρ€Π°Ρ„Π°

settings.gradle

  • Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» сапускаСтся Π²ΠΎ врСмя ΠΏΠ΅Ρ€Π²ΠΎΠΉ Ρ„Π°Π·Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

  • Π’Ρ‹Π·ΠΎΠ²Ρ‹ Π² этом Ρ„Π°ΠΉΠ»Π΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Settings

  • Для ΠΌΠ½ΠΎΠ³ΠΎΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… (multi-project) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² settings.gradle Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² Π½Π΅ΠΌ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

Project evaluation

  • Π’ΠΎ врСмя Ρ„Π°Π·Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Gradle ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, запускаСт build скрипт ΠΈ создаСт таски (Gradle ΡƒΠΌΠ΅Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ build-скрипты, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½Ρ‹ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ таска)

  • Π’ api Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΄ΠΎ ΠΈΠ»ΠΈ послС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ: ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ beforeEvaluate() ΠΈ afterEvaluate() Ρƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

  • Π­Ρ‚ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΈΠ· ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ-Ρ‚ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ Ρƒ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²

gradle.properties

  • Π€Π°ΠΉΠ», Π»Π΅ΠΆΠ°Ρ‰ΠΈΠΉ Π² ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ (Π° Π΅Ρ‰Π΅ Π² GRADLE_USER_HOME ΠΈ Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ gradle для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… свойств).

  • ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ JVM для запуска gradle (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, org.gradle.jvmargs=-Xmx4096m)

  • ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ самого Gradle

  • ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ свои свойства, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ доступны ΠΈΠ· gradle скриптов

  • вмСсто использования gradle.properties, свойства ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ строку Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -p (ΡƒΠ΄ΠΎΠ±Π½ΠΎ для ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π»ΠΎΠ³ΠΈΠ½ΠΎΠ² ΠΈ ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ)

Extra properties

МногиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ Gradle (Π² Ρ‚ΠΎΠΌ числС Task ΠΈ Project) ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свойства Π² Π²ΠΈΠ΄Π΅ ΠΊΠ»ΡŽΡ‡-Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. ΠšΠ»ΡŽΡ‡ β€” это строка, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” это класс Object.

project.ext.test = "Test"   // Groovy DSL

// or

project.extra["test"] = "Test"   // Kotlin DSL

// or

project
    .getExtensions()
    .getExtraProperties()
    .set("test", "Test")

Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ

ВсС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΡŽΡ‚ΡΡ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠΎΠ³ ΠΈΡ… сСбС ΠΏΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ. РаньшС Π±Ρ‹Π»ΠΈ популярны JCenter ΠΈ Google Maven, ΠΎΠ΄Π½Π°ΠΊΠΎ JCenter объявлСн ΠΊΠ°ΠΊ deprecated ΠΈ сСйчас Π΅ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π²:

  • google() (Google Maven)

  • mavenCentral()

  • ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Π΅ Maven-Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

  • Ivy

  • локальная файловая систСма

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ вСрсии доступны Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹Ρ… рСпозиториях ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ссылкС:

https://mvnrepository.com/artifact/<package-root>/<package-name>

НапримСр, для ΠΏΠ°ΠΊΠ΅Ρ‚Π° org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ доступных вСрсиях Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… рСпозиториях ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎ ссылкС: https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-gradle-plugin

  • Π Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΊ build-скрипту ΠΈΠ»ΠΈ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌ: ΠΏΠ΅Ρ€Π²Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Π²ΠΎ врСмя Ρ„Π°Π·Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹ gradle), Π²Ρ‚ΠΎΡ€Ρ‹Π΅ β€” Π²ΠΎ врСмя получСния зависимостСй ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° (ΠΎΠ½ΠΈ Π½ΡƒΠΆΠ½Ρ‹ Π½Π°ΡˆΠ΅ΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ)

  • Π’ качСствС транспорта ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹

  • Π›ΡƒΡ‡ΡˆΠ΅ Π½Π΅ ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ всС Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· allprojects, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ врСмя ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Dependencies

  • УказываСтся Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… ΠΈ для build-скрипта

  • Зависимости ΠΎΡ‚ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ: implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4")

  • ΠŸΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹Π΅ зависимости: implementation project(":core")

  • Π€Π°ΠΉΠ»ΠΎΠ²Ρ‹Π΅ зависимости: implementation fileTree(dir: 'libs', include: ['*.jar'])

  • Π”Π΅Ρ€Π΅Π²ΠΎ зависимостСй ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ таски dependencies β€” ./gradlew dependencies [--configuration implementation].

Modules

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ имСнования:

org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.4

<group>:<name>:<version>

Configurations

  • КаТдая Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ скоупу: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ зависимости Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя компиляции, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎ врСмя тСстов, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² runtime ΠΈ Ρ‚.Π΄.

  • Для управлСния скоупами Π² gradle ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хранятся Π² ConfigurationContainer

  • По сути конфигурация β€” это ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для зависимостСй

  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π½Π°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ‚ΠΎΠ΄ extendsFrom()

  • Π”ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ всС зависимости ΠΎΡ‚ своих Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ

  • ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ gradle создаСт ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (compile ΠΈ runtime β€” deprecated) для java gradle plugin:

Π’ java library plugin Π΅Ρ‰Π΅ появляСтся конфигурация api. Π•Π΅ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ implementation Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ доступ ΠΊΠΎ всСм зависимым модулям (Ρ€Π°Π½ΡŒΡˆΠ΅ compile Ρ‚Π°ΠΊ Π΄Π΅Π»Π°Π» β€” ΠΎΠ½ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π» доступ ΠΊΠΎ всСм Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠΌ зависимостям, implementation Ρ‚Π°ΠΊ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚).

compileOnly β€” конфигурация ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° этап ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (ΠΊΠΎΠ³Π΄Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ Π² runtime). implementation ΠΏΠΎΠ΄Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² runtime. Π“Ρ€Π°ΠΌΠΎΡ‚Π½ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ compileOnly ΠΈ implementation ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ врСмя сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Resolution strategy

  • ΠœΠ΅ΠΆΠ΄Ρƒ зависимостями ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Ρ‹

  • Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ gradle ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°Ρ… β€” Ρ‡Π΅Ρ€Π΅Π· resolution strategy

  • ПовСдСниС ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ β€” gradle Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

configurations.all {
    resolutionStrategy.failOnVersionConflict()
}

Π§Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· resolution strategy

  • Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ зависимости (dependencySubstitution)

  • ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ (force)

  • Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½Ρ‹Π΅ зависимости вмСсто Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… (preferProjectModules)

  • ΠΏΠ°Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°Ρ… (failOnVersionConflict)

  • ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ (snapshot)

Transitive dependencies

  • Π’Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ зависимости β€” это Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ зависимости прямой зависимости

  • Π£ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ Π΅ΡΡ‚ΡŒ Ρ„Π»Π°Π³ isTransitive(), Ссли ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ true, Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒΡΡ Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΠ΅ зависимости

  • Π’Π°ΠΊΠΎΠΉ ΠΆΠ΅ Ρ„Π»Π°Π³ Π΅ΡΡ‚ΡŒ Ρƒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

  • По-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ isTransitive()=true, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ

dependencies {
    implementation('com.google.guava:guava:23.0') {
        transitive = false
    }
}

Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ подтягиваСм зависимости guava ΠΊ сСбС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΈΡ… Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

Dependency constraints

МоТно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ограничСния для вСрсий ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ Ρ‡Π΅Ρ€Π΅Π· constraints, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ зависимости.

dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        implementation('org.apache.httpcomponents:httpclient:4.5.3')
        implementation('commons-codec:commons-codec:1.11')
    }
}

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ΡˆΠ΅ httpclient зависит ΠΎΡ‚ commons-codec, ΠΈ ΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· constraints ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ фиксируСм Π²Π΅Ρ€ΡΠΈΡŽ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½ΠΎΠΉ зависимости.

Excluding transitive dependencies

МоТно ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚Ρ€Π°Π½Π·ΠΈΡ‚ΠΈΠ²Π½Ρ‹Π΅ зависимости Ρ‡Π΅Ρ€Π΅Π· exclude (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρƒ нас Π΄Π²Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ тянут ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ зависимости; ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ спокойно ΡƒΠ±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ зависимостСй ΠΈ всС Π±ΡƒΠ΄Π΅Ρ‚ спокойно ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒΡΡ):

dependencies {
    implementation('log4j:log4j:1.2.15') {
        exclude group: 'javax.jms', module: 'jms'
        exclude group: 'com.sun.jdmx', module: 'jmxtools'
        exclude group: 'com.sun.jmx', module: 'jmxri'
    }
}

Because

ВмСсто ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΊ зависимостям, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ свойство because. ΠŸΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° зависимостСй, этот ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ отобразится Π² консоли :)

implementation('log4j:log4j:1.2.15') {
    because "We love log4j"
}

Plugins

  • ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ написаны скриптом, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ jar (ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚) ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² buildSrc

  • Π”ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ таски, свойства, зависимости, ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

  • Π Π°ΡΡˆΠΈΡ€ΡΡŽΡ‚ DSL ΠΈ Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ модСль

  • Π’ ΠΎΠ±Ρ‰Π΅ΠΌ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ

Π•ΡΡ‚ΡŒ встроСнныС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ вмСстС с gradle. НапримСр, java plugin, java library plugin.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ скриптового ΠΏΠ»Π°Π³ΠΈΠ½Π°:

apply from: 'other.gradle'

Binary plugins ΠΈΠΌΠ΅ΡŽΡ‚ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, доступны ΠΈΠ· рСпозитория ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ Ρ‡Π΅Ρ€Π΅Π· старый синтаксис "apply plugin" ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊ plugins{} (всСгда Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ).

SourceSets

  • Java Plugin (ΠΈΠ»ΠΈ Kotlin Plugin) вносит Π² Π΄ΠΎΠΌΠ΅Π½Π½ΡƒΡŽ модСль Gradle Ρ‚Π°ΠΊΠΎΠ΅ понятиС ΠΊΠ°ΠΊ source set

  • Source Sets ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСсурсы ΠΈ исходныС Ρ„Π°ΠΉΠ»Ρ‹ Π² логичСскиС Π³Ρ€ΡƒΠΏΠΏΡ‹

  • Java Plugin создаСт для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Source Set ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ таск compileSourceSetJava ΠΈ нСсколько ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ (для Source Set "main" имя опускаСтся β€” compileJava)

  • Аналогично для рСсурсов ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ таски processSourceSetResources.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

// Groovy DSL
sourceSets {
    main {
        java {
            srcDirs = [
                "src/main/java",
                "${protobuf.generatedFilesBaseDir}/main/javalite"
            ]
            exclude 'some/unwanted/package/**'
        }
    }
}

Flavors & BuildTypes

  • Build types β€” Ρ‚ΠΈΠΏΡ‹ сборок, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ release ΠΈ debug, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°

  • Product flavors β€” Ρ€Π°Π·Π³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ сборки ΠΏΠΎ Ρ„ΠΈΡ‡Π°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, платная вСрсия ΠΈ с ΡƒΡ€Π΅Π·Π°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ)

  • Build variants β€” всС ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ Build types ΠΈ Product flavors

  • Π’ Π΄ΠΎΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΠΈ прСдставлСны ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ классами: BuildType, ProductFlavor ΠΈ BaseVariant (содСрТит BuildType ΠΈ ProductFlavor)

  • BuildType ΠΈ ProductFlavor Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ ΠΎΡ‚ BaseConfigImpl

Для всСх Π½ΠΈΡ… ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ source set'Ρ‹ ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ таски.

flavor dimension - ΠΏΠΎΠ΄ этим ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

flavorDimensions "site", "endpoint", "market"

productFlavors - здСсь ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ значСния для dimension. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

productFlavors {
        prod {
            dimension 'endpoint'
            applicationId 'blabla1'
        }

        staging {
            dimension 'endpoint'
            applicationId 'blabla2'
            здСсь ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π»ΡŽΠ±Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ (Ρ‚Π΅ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π² defaultConfig)
        }

        google {
            dimension 'market'
        }

        amazon {
            dimension 'market'
        }

    }

Π—Π΄Π΅ΡΡŒ: Π² ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ endpoint ΠΌΠΎΠ³ΡƒΡ‚ содСрТатся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π°Π±ΠΎΡ€Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²: prod, staging

Π”Π°Π»Π΅Π΅, эти значСния ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ buildTypes (ΠΊΠ°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ?)

Kotlin & Groovy DSL

Gradle Kotlin DSL Usage: https://github.com/IkeMurami-Examples/AndroidAppExamples/tree/main/KotlinDSLUsage

buildSrc & Version Catalog

Особая дирСктория Gradle, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ выносятся:

  • константы

  • внСшниС зависимости ΠΈ вСрсии

  • ΠΈΠΌΠ΅Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ

  • таски для сборки

  • ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для сборки

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: https://github.com/IkeMurami-Examples/KotlinMultiplatformExample

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° этому β€” ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Version Catalog (появился Π² 7-ΠΉ вСрсии Gradle ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Kotlin DSL) ΠΊΠ°ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠ΅ мСсто Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ вСрсиях Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: https://habr.com/ru/post/560868/

Для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ этой Ρ„ΠΈΡ‡ΠΈ, добавляСм Π² settings.gradle.kts:

enableFeaturePreview("VERSION_CATALOGS")

ΠΈ Π² ΠΏΠ°ΠΏΠΊΠ΅ gradle ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ toml-Ρ„Π°ΠΉΠ» libs.versions.toml.

Last updated