본문 바로가기

Build/Gradle

Gradle 도큐먼트: 작업(Tasks) 실행하기

더보기

작업(Tasks)은 Gradle이 빌드의 일부로 수행 할 수 있는 실행 단위입니다.

이 문서의 시작에 앞서 이 블로그의 문서: Gradle 프로젝트 시작하기를 선행해야 합니다.

Gradle은 빌드 스크립트의 기능을 확장하기 위한 빌트인(Built-in) Task를 제공합니다.

예를 들어 Copy는 파일을 복사하는 빌트인 중 하나입니다.

tasks.register("copyTask",Copy) {
	from("source")
	into("target")
	include("*.war")
}

하위 프로젝트의 build.gradle.kts에 코드를 추가하면 ./gradlew :app:copyTask를 실행해 Task를 수행 할 수 있습니다.

대표적으로 제공되는 빌트인 Task는 다음과 같습니다.

  • Copy는 파일을 복사합니다.
  • Delete는 파일 또는 디렉토리를 삭제합니다.
  • Exec는 O/S 명령을 실행합니다.
  • Zip은 파일을 압축합니다.

더 많은 Task를 확인하려면 DSL documentation을 참고합니다.

Task 목록 확인

수행 가능한 Task 목록을 확인하려면 Gradle 프로젝트의 루트 디렉토리에서 ./gradlew tasks를 사용합니다.

$ ./gradlew tasks

표시되는 목록에는 애플리케이션 플러그인애플리케이션 플러그인이 제공하는 Task가 포함됩니다.

예제 프로젝트 tutorial에서는 Gradle 프로젝트가 초기화되면서 기본으로 수행 가능한 Task가 포함됩니다.

$ /gradlew tasks

> Task :tasks
------------------------------------------------------------
Tasks runnable from root project 'tutorial'
------------------------------------------------------------
Application tasks
-----------------
... (중략) ...

Build tasks
-----------
... (중략) ...

Build Setup tasks
-----------------
... (중략) ...

Distribution tasks
------------------
... (중략) ...

Documentation tasks
-------------------
... (중략) ...

Help tasks
----------
... (중략) ...

Verification tasks
------------------
... (중략) ...

BUILD SUCCESSFUL in 628ms
1 actionable task: 1 executed

Task는 컴파일 파일 복사 및 이동 JAR 파일 생성 Javadoc 생성 작업물을 리포지토리에 푸시하는 등 개별 실행을 담당합니다.

하위 프로젝트에서만 수행 할 수 있는 Task를 표시하려면 ./gradlew :app:tasks를 사용합니다.

더보기

Task 목록의 상세 정보를 표시하려면 --all 옵션을 추가합니다.

$ ./gradlew tasks --all

Task 간 의존성

Task가 다른 Task의 선행을 필요로 하는 것은 흔합니다.

이 같은 Task 간 의존성은 명시적으로 선언되거나 암묵적으로 의존되기도 합니다.

다음은 의존성을 명시적인 선언하는 예시입니다.

tasks.register("hello") 
{
	println('Hello!')
}

tasks.register("greet") 
{
	println('How are you?')
	dependsOn("hello")
}

hellogreet가 수행되기 앞서 선행됩니다. 따라서 실행 결과는 Hello! How are you?입니다.

더보기

Task의 실행 순서는 명시적 또는 암묵적 의존성을 고려하여 Gradle이 결정합니다.

만약 Task 간에 의존성이 없다면 사용자가 실행 순서를 조절하여 요청 할 수 있습니다.

IntelliJ IDEA에서 Task 실행

settings.gradle.kts 파일을 실행하면 IDE에서 프로젝트가 열립니다.

IntelliJ IDEA에서 tutorial 프로젝트를 열고 Gradle 창을 엽니다.

tutorial | Tasks | build | build를 실행하여 Task를 실행합니다.

build Task가 진행되고 완료(또는 실패)되기까지의 경과를 IDE 콘솔에서 확인 할 수 있습니다.

6:43:00 오후: Executing task 'build'...

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE

BUILD SUCCESSFUL in 941ms
7 actionable tasks: 7 up-to-date
6:43:01 오후: Task execution finished 'build'.

터미널(Terminal)에서 Task 실행

터미널에서 ./gradlew build를 실행합니다.

$ ./gradlew build

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE

build Task는 소스 코드와 의존성을 사용하여 앱을 빌드합니다.

콘솔에서 출력되는 Task는 실행 순서와 일치합니다. 따라서 build Taskjar Task에 의존하고 있음을 알 수 있습니다.

더보기

./gradle jar으로 Task를 직접 실행해 봅니다.

$ ./gradlew jar

> Task :app:compileJava
> Task :app:processResources
> Task :app:classes
> Task :app:jar

jar Task는 앱의 실행 가능한 JAR 파일을 생성하는데, 이를 위해서 compileJava Task에 대한 의존성을 갖습니다.

Task가 완료되면 app/build/libs 디렉토리에 app.jar 파일이 생성됩니다.

$ cd app/build/libs  
$ ls -l
-rw-r--r--  1 guenbongpark  staff  1106 11 14 18:56 app.jar

run Task를 실행하고 콘솔에 출력되는 결과를 확인합니다.

$ ./gradlew run

> Task :app:run
Hello World!

BUILD SUCCESSFUL in 526ms
2 actionable tasks: 1 executed, 1 up-to-date

이 Task는 tutorial/app/src/main/java/com.gradle.tutorial/App.java 코드를 실행합니다.

Task가 실행하는 자바 코드는 Hello World! 텍스트를 출력하는 간단한 프로그램입니다.

public class App 
{
	public String getGreeting() {
		return "Hello World!";
	}
    
	public static void main(String[] args) {
		System.out.println(new App().getGreeting());
	}
}

정리 및 복습

  • 작업(Tasks)는 Gradle이 빌드의 일부로 수행하는 실행 단위입니다.
  • 사용자는 Gradle이 제공하는 빌트인(Built-in) Task를 사용하여 빌드 스크립트의 기능을 확장 할 수 있습니다.
더보기

대표적으로 제공되는 빌트인 Task는 다음과 같습니다.

Copy Delete Exec Zip
파일을 복사합니다. 파일 또는 디렉토리를 삭제합니다. O/S 명령을 실행합니다. 파일을 압축합니다.

더 많은 Task를 확인하려면 DSL documentation을 참고합니다.

  • Gradle 프로젝트의 Task 목록을 확인하려면 ./gradlew tasks를 사용합니다.
  • 하위 프로젝트의 Task 목록은 ./gradlew :app:tasks을 사용합니다.
  • Task 목록을 상세히 표시하려면 --all 옵션을 추가합니다.
  • Task를 실행하려면 ./gradlew [Task 이름]을 실행합니다.
  • Task는 실행을 위해 다른 Task가 선행해야 하는 의존성 관계에 있을 수 있습니다.
  • Taks 간의 의존성은 명시적으로 선언(dependsOn)되거나 암묵적으로 선언됩니다.
더보기

Task의 실행 순서는 Gradle에 의해서 자동으로 결정됩니다.

Task가 실행되어 콘솔에 표시되는 결과를 살펴보면 Task 간의 의존성을 확인 할 수 있습니다.

아래 예시에서 build Task를 실행하면 jar Task가 선행됩니다. 따라서 build Taskjar Task에 의존성을 갖고 있음을 알 수 있습니다.

$ ./gradlew build

> Task :app:compileJava UP-TO-DATE
> Task :app:processResources NO-SOURCE
> Task :app:classes UP-TO-DATE
> Task :app:jar UP-TO-DATE
> Task :app:startScripts UP-TO-DATE
> Task :app:distTar UP-TO-DATE
> Task :app:distZip UP-TO-DATE
> Task :app:assemble UP-TO-DATE
> Task :app:compileTestJava UP-TO-DATE
> Task :app:processTestResources NO-SOURCE
> Task :app:testClasses UP-TO-DATE
> Task :app:test UP-TO-DATE
> Task :app:check UP-TO-DATE
> Task :app:build UP-TO-DATE