[Gradle] ๋นŒ๋“œ ์ˆ˜๋ช… ์ฃผ๊ธฐ

2023. 2. 26. 19:09ยทTool/Gradle

Gradle์€ ์˜์กด์„ฑ ๊ธฐ๋ฐ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ ์˜ˆ๋กœ, ์ž‘์—…๊ณผ ์ž‘์—… ๊ฐ„์˜ ์ข…์† ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. Gradle์€ ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์ข…์† ํ•ญ๋ชฉ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์™€ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ด ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ํŽ˜์ด์ง€์—์„œ๋Š” Gradle์ด ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•ด์„ํ•  ๋•Œ ๊ฑฐ์น˜๋Š” ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜๋ช… ์ฃผ๊ธฐ์˜ ์ด๋ฒคํŠธ์— ๋Œ€์‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Task Graphs

์ผ๋ถ€ ๋นŒ๋“œ ๋„๊ตฌ๋Š” ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค. Gradle์€ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋ฐฉ์ง€ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด Gradle์€ ํ˜„์žฌ ๋นŒ๋“œ์— ํฌํ•จ๋˜์ง€ ์•Š์€ ์ž‘์—…์˜ ๊ตฌ์„ฑ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

๊ฐ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ž‘์—…์€ DAG(๋ฐฉํ–ฅ์„ฑ ๋น„์ˆœํ™˜ ๊ทธ๋ž˜ํ”„)๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‹ค์ด์–ด๊ทธ๋žจ์€ ๋‘ ๊ฐœ์˜ ์˜ˆ์ œ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค: ํ•˜๋‚˜๋Š” ์ถ”์ƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ตฌ์ฒด์ ์ž…๋‹ˆ๋‹ค.

The diagram represents dependencies between tasks as arrows:

Figure 1. Two examples of Gradle task graphs

 

ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ž์ฒด ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋‘ ์ž‘์—… ์ข…์†์„ฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ์ž‘์—… ๊ทธ๋ž˜ํ”„์— ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.

Build Phases

Gradle ๋นŒ๋“œ์—๋Š” ์„ธ ๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Gradle์€ ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ดˆ๊ธฐํ™”, ๊ตฌ์„ฑ, ๋งˆ์ง€๋ง‰์œผ๋กœ ์‹คํ–‰์˜ ์ˆœ์„œ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Initialization
  • ์„ค์ • ํŒŒ์ผ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์ • ํŒŒ์ผ์„ ํ‰๊ฐ€ํ•˜์—ฌ ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฐ ํฌํ•จ๋œ ๋นŒ๋“œ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด Project ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Configuration
  • ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๋Š” ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์˜ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ๋œ ์ž‘์—…์— ๋Œ€ํ•œ ์ž‘์—… ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
Execution
  • ์„ ํƒํ•œ ๊ฐ ์ž‘์—…์„ ์ข…์†์„ฑ ์ˆœ์„œ๋Œ€๋กœ ์˜ˆ์•ฝํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Example

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ์„ค์ • ๋ฐ ๋นŒ๋“œ ํŒŒ์ผ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ๋‹ค์–‘ํ•œ ๋นŒ๋“œ ๋‹จ๊ณ„์— ํ•ด๋‹นํ•˜๋Š”์ง€ ๋ณด์—ฌ ์ค๋‹ˆ๋‹ค.

settings.gradle.kts
rootProject.name = "basic"
println("This is executed during the initialization phase.")
 
build.gradle.kts
println("This is executed during the configuration phase.")

tasks.register("configured") {
    println("This is also executed during the configuration phase, because :configured is used in the build.")
}

tasks.register("test") {
    doLast {
        println("This is executed during the execution phase.")
    }
}

tasks.register("testBoth") {
    doFirst {
        println("This is executed first during the execution phase.")
    }
    doLast {
        println("This is executed last during the execution phase.")
    }
    println("This is executed during the configuration phase as well, because :testBoth is used in the build.")
}

๋‹ค์Œ ๋ช…๋ น์€ ์œ„์—์„œ ์ง€์ •ํ•œ ํ…Œ์ŠคํŠธ ๋ฐ testBoth ์ž‘์—…์„ ๊ตฌ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Gradle์€ ์š”์ฒญ๋œ ์ž‘์—…๊ณผ ๊ทธ ์ข…์† ํ•ญ๋ชฉ๋งŒ ๊ตฌ์„ฑํ•˜๋ฏ€๋กœ ๊ตฌ์„ฑ๋œ ์ž‘์—…์€ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

> gradle test testBoth
This is executed during the initialization phase.

> Configure project :
This is executed during the configuration phase.
This is executed during the configuration phase as well, because :testBoth is used in the build.

> Task :test
This is executed during the execution phase.

> Task :testBoth
This is executed first during the execution phase.
This is executed last during the execution phase.

BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed

Initialization

์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ Gradle์€ ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ ๋ฐ ํฌํ•จ๋œ ๋นŒ๋“œ๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. Gradle์€ ๋จผ์ € ์„ค์ • ํŒŒ์ผ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Gradle์€ ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ํ”„๋กœ์ ํŠธ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค.

Detect Settings File

settings.gradle ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ Gradle์„ ์‹คํ–‰ํ•˜๋ฉด Gradle์€ ์ด settings.gradle ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ์˜ ๋ชจ๋“  ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ Gradle์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. settings.gradle ํŒŒ์ผ์ด ์—†๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ Gradle์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ

:

  1. Gradle์€ ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ settings.gradle(.kts) ํŒŒ์ผ์„ ์ฐพ์Šต๋‹ˆ๋‹ค.
  2. Gradle์ด settings.gradle(.kts) ํŒŒ์ผ์„ ์ฐพ์œผ๋ฉด ํ˜„์žฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์˜ ์ผ๋ถ€์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด Gradle์€ ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.
  3. Gradle์ด settings.gradle(.kts) ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด Gradle์€ ๋‹จ์ผ ํ”„๋กœ์ ํŠธ๋กœ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค.

ํ‘œ์ค€ Gradle ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ์—์„œ ํ”„๋กœ์ ํŠธ ๊ฒฝ๋กœ๋Š” ๋””์Šคํฌ์˜ ์‹ค์ œ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์ž๋™ ๊ฒ€์ƒ‰์€ ํ‘œ์ค€ ํ”„๋กœ์ ํŠธ ๋ ˆ์ด์•„์›ƒ์ด ์žˆ๋Š” ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์—์„œ๋งŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋น„ํ‘œ์ค€ ๋ ˆ์ด์•„์›ƒ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๋ ค๋ฉด settings.gradle(.kts)์ด ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Evaluate Settings File

์„ค์ • ํŒŒ์ผ ํ‰๊ฐ€ ์ค‘, Gradle:
  • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณตํ•ฉ ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๋Š” ํฌํ•จ๋œ ๋นŒ๋“œ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์ค‘ ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ์— ์ฐธ์—ฌํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Gradle์€ ๋นŒ๋“œ์˜ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์€ ์ตœ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฃจํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” ๋ถ€๋ชจ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์—๋Š” ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Configuration

๊ตฌ์„ฑ ๋‹จ๊ณ„์—์„œ Gradle์€ ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ์— ํ•  ์ผ ๋ฐ ๊ธฐํƒ€ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋‹จ๊ณ„๊ฐ€ ๋๋‚˜๋ฉด Gradle์€ ์š”์ฒญ๋œ ์ž‘์—…์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ž‘์—… ์‹คํ–‰ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Project Evaluation

ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ ์ค‘์— Gradle์€ ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ‰๊ฐ€ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์ž‘์—… ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณ„์ธต ๊ตฌ์กฐ์—๋Š” ๋ชจ๋“  ์ž‘์—…์— ๋Œ€ํ•œ ์ž…๋ ฅ, ์ž‘์—… ๋ฐ ์ถœ๋ ฅ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

React to Project Evaluation

ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ ์ง์ „๊ณผ ์งํ›„์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์€ ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€๊ฐ€ ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”„๋กœ์ ํŠธ ๋˜๋Š” ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ ์•Œ๋ฆผ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์„ ๋‹ค์Œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ชจ๋“  ์ •์˜๋ฅผ ์ ์šฉํ•œ ํ›„์˜ ์ถ”๊ฐ€ ๊ตฌ์„ฑ
  • ์‚ฌ์šฉ์ž ์ง€์ • ๋กœ๊น…
  • ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋กœํŒŒ์ผ๋ง

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” gradle.beforeProject()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ hasTests ์†์„ฑ์„ ํŠน์ • ํ…Œ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์˜ˆ์ œ์—์„œ๋Š” gradle.afterProject()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ hasTests ์†์„ฑ ๊ฐ’์ด true์ธ ๊ฐ ํ”„๋กœ์ ํŠธ์— ํ…Œ์ŠคํŠธ ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

build.gradle.kts
gradle.beforeProject {
    // Set a default value
    project.ext.set("hasTests", false)
}

gradle.afterProject {
    if (project.ext.has("hasTests") && project.ext.get("hasTests") as Boolean) {
        val projectString = project.toString()
        println("Adding test task to $projectString")
        tasks.register("test") {
            doLast {
                println("Running tests for $projectString")
            }
        }
    }
}
 
project-a.gradle.kts
extra["hasTests"] = true
> gradle -q test
Adding test task to project ':project-a'
Running tests for project ':project-a'

ํด๋กœ์ € ๋Œ€์‹  ๋ฆฌ์Šค๋„ˆ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ๋นŒ๋“œ์˜ Gradle ์ธ์Šคํ„ด์Šค์— ProjectEvaluationListener๋ฅผ ์ถ”๊ฐ€ ํ•˜์„ธ์š”.

Task Execution Graph Assembly

ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ ์ค‘์— Gradle์€ ์ž‘์—… ์‹คํ–‰ ๊ทธ๋ž˜ํ”„, ์ฆ‰ ์ž‘์—… ๊ฐ„์˜ ์ข…์†์„ฑ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” DAG๋ฅผ ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

React to Task Execution Graph Assembly

Gradle์ด ํ”„๋กœ์ ํŠธ์˜ ์ž‘์—… ์‹คํ–‰ ๊ทธ๋ž˜ํ”„ ์ž‘์„ฑ์„ ์™„๋ฃŒํ•œ ์งํ›„์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ TaskExecutionGraph์— TaskExecutionGraphListener๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Task Creation

ํ”„๋กœ์ ํŠธ ํ‰๊ฐ€ ์ค‘์— Gradle์€ ์ž‘์—… ๋ฐ ๊ตฌ์„ฑ ์ž‘์—…์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์ž‘์—…์€ ํ•ด๋‹น ์ž‘์—…์— ๋Œ€ํ•œ ์ž…๋ ฅ, ์ถœ๋ ฅ ๋ฐ ์ž‘์—…์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ด ์š”์ฒญ๋œ ์ž‘์—…์— ๋Œ€ํ•œ ์ž‘์—… ๊ทธ๋ž˜ํ”„์˜ ์ผ๋ถ€์ธ ๊ฒฝ์šฐ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค.

React to Task Creation

Gradle์ด ํ”„๋กœ์ ํŠธ์— ํ•  ์ผ์„ ์ถ”๊ฐ€ํ•œ ์งํ›„์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ถ€ ๊ธฐ๋ณธ๊ฐ’ ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ํ”„๋กœ์ ํŠธ์˜ ๊ฐ ์ž‘์—…์— ๋Œ€ํ•ด srcDir ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
 
build.gradle.kts
tasks.whenTaskAdded {
    extra["srcDir"] = "src/main/java"
}

val a by tasks.registering

println("source dir is ${a.get().extra["srcDir"]}")
> gradle -q a
source dir is src/main/java

ํด๋กœ์ € ๋Œ€์‹  ์ˆ˜์‹ ๊ธฐ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด TaskContainer์— ์ž‘์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Execution

์‹คํ–‰ ๋‹จ๊ณ„์—์„œ Gradle์€ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Gradle์€ ๊ตฌ์„ฑ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋œ ์ž‘์—… ์‹คํ–‰ ๊ทธ๋ž˜ํ”„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ž‘์—…์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Task Execution

์ž‘์—… ์‹คํ–‰์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋นŒ๋“œ์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‹ค์šด๋กœ๋“œ, ์ฝ”๋“œ ์ปดํŒŒ์ผ, ์ž…๋ ฅ ์ฝ๊ธฐ ๋ฐ ์ถœ๋ ฅ ์ž‘์„ฑ)์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

React to Task Execution Notifications

 

์ž‘์—… ์‹คํ–‰ ์ด๋ฒคํŠธ๋Š” ๊ตฌ์„ฑ ์บ์‹œ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์บ์‹œ์™€ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘์—… ์‹คํ–‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Gradle์ด ์ž‘์—…์„ ์‹คํ–‰ํ•˜๊ธฐ ์ง์ „๊ณผ ์งํ›„์— ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์€ ์ž‘์—… ์‹คํ–‰์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ์—์„œ๋Š” ๊ฐ ์ž‘์—… ์‹คํ–‰์˜ ์‹œ์ž‘๊ณผ ๋์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
 
build.gradle.kts
tasks.register("ok")

tasks.register("broken") {
    dependsOn("ok")
    doLast {
        throw RuntimeException("broken")
    }
}

gradle.taskGraph.beforeTask {
    println("executing $this ...")
}

gradle.taskGraph.afterTask {
    if (state.failure != null) {
        println("FAILED")
    } else {
        println("done")
    }
}
 
> gradle -q broken
executing task ':ok' ...
done
executing task ':broken' ...
FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':broken'.
> broken

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 0s

ํด๋กœ์ € ๋Œ€์‹  ์ˆ˜์‹ ๊ธฐ๋ฅผ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๋ ค๋ฉด ํ”„๋กœ์ ํŠธ์˜ TaskExecutionGraph์— TaskExecutionListener๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

 

728x90
'Tool/Gradle' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Gradle] ํ•˜์œ„ ํ”„๋กœ์ ํŠธ ๊ฐ„์˜ ์ข…์†์„ฑ ์„ ์–ธ(Declaring Dependencies between Subprojects)
  • Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œํ”„ํŠธ์›จ์–ด ๊ตฌ์„ฑ์š”์†Œ ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์„ฑ ๋ฐ ๋นŒ๋“œํ•˜๊ธฐ
  • Gradle 8.0.1 Release Notes(๋ณ€๊ฒฝ๋œ ์ )
  • Gradle์˜ ์ข…์†์„ฑ ๊ด€๋ฆฌ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
์ผ์ƒ, ๊ฒŒ์ž„, ๋ง›์ง‘, ์—ฌํ–‰, ๊ฐœ๋ฐœ, IT ๋ธ”๋กœ๊ทธ๐Ÿงž
  • ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
    ์š”์ˆ  ๋žจํ”„๐Ÿซ–
    ์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • All (549)
      • Languages (57)
        • JAVA (13)
        • JSP (1)
        • C_C++ (4)
        • Html (3)
        • CSS (1)
        • JavaScript (18)
        • Python (3)
        • Kotlin (13)
        • TypeScript (1)
      • Framework (14)
        • spring (11)
        • jstl (1)
        • angular (2)
      • Tool (28)
        • Eclipse (5)
        • vsCode (3)
        • scrcpy (2)
        • Git (1)
        • IntelliJ (6)
        • Visual-studio (1)
        • UML (1)
        • Gradle (8)
      • DB (6)
        • Oracle (1)
        • MySql (3)
        • Mongo (2)
      • OS (14)
        • Linux (2)
        • Windows (12)
      • Server (8)
        • Tomcat (1)
        • Apache (1)
        • Node.js (6)
      • Programmings (25)
        • Design Pattern (2)
        • Funny (20)
        • Algorithms (3)
      • Cloud (8)
        • Docker (1)
        • Kubernetes (4)
        • Istio (1)
        • ArgoCD (2)
      • IT (5)
        • gRPC (3)
        • RESTful (3)
        • Web UI (5)
        • AI (4)
      • Book (6)
      • TIP (187)
      • Life (53)
      • Game (83)
      • Storage (22)
      • ์‹๋‹น (15)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
    • ์‚ฌ์ดํŠธ๋งต
    • RSS
    • ๊ธฐํƒ€ ์†Œ๋“
  • ๋งํฌ

    • ๊ตฌ๊ธ€
    • ๋„ค์ด๋ฒ„
    • ์ •๋ถ€24
    • Spring Framework ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • Kotlin ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ
    • ์นด์นด์˜ค ์• ๋“œํ•
    • ๋ธ”๋กœ๊ทธ ์‚ฌ์ดํŠธ๋งต
    • ๋ธ”๋กœ๊ทธ RSS
  • ๊ณต์ง€์‚ฌํ•ญ

    • ์•ˆ๋…•ํ•˜์„ธ์š”
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์˜ค๋Š˜์˜๋‰ด์Šค
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ์™€์ผ์ฆˆ
    ๋ชฌ์Šคํ„ฐํ—Œํ„ฐ๋‚˜์šฐ
    ํ€˜์ŠคํŠธ
    ๋‰ด์Šค
    ๋‰ด์Šค ๋ธŒ๋ฆฌํ•‘
    ๋ธŒ๋ฆฌํ•‘
    ํƒœ๊ตญ
    ๋ฐ์ผ๋ฆฌ ๋‰ด์Šค
    ํ•œ๋ˆˆ์— ๋ณด๋Š” ์˜ค๋Š˜์˜ ๋‰ด์Šค
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ง€๋‹ˆ๐Ÿงž‍โ™‚๏ธ๐Ÿฅญ
[Gradle] ๋นŒ๋“œ ์ˆ˜๋ช… ์ฃผ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”