All Articles

Gradle

프로젝트에서 필요한 xml, properties, jar 파일들을 자동으로 인식하여 빌드해주는 도구이다.

Maven vs Gradle

  • 두가지 기능이 메인이다. 빌드과정 자동화의존성 관리.
  • 구글 트렌드상으로는 Maven이 좀더 우세하다고는 하나, Maven은 지는 해고 Gradle은 뜨는 해인 듯. 신규 프로젝트는 Gradle로 하는 게 대세라고 한다.

Maven

  • Ant라는 툴을 대체하기 위해 만들어짐. Ant는 빌드 기능만 있었는데, Maven은 라이브러리 관리 기능이 추가되었음
  • pom.xml 파일로, 프로젝트의 외부 라이브러리(디펜던시)를 참조할 수 있게 명시 관리. 참조한 외부 라이브러리에 연관된 다른 라이브러리도 자동으로 관리됨. 따라서 세세한 부분까진 신경쓰지 않아도 된다고 한다.

Maven 대표 태그들

  • modelVersion: maven의 버전
  • groupId: 프로젝트 내 그룹id. 일반적으로, 대표하는 사이트 도메인 역순으로 적음
  • artifactId: groupId 외에 프로젝트끼리 겹치지 않게 하기 위해 프로젝트에 id를 부여한 것
  • version: 프로젝트의 버전(개발 단계에 따라 알아서 작성하면 됨)
  • name: 프로젝트의 이름
  • properties: pom.xml 내에서 중복해서 쓰이는 상수를 여기서 갖다쓸 수 있게 정의한 것. ${태그명} 형태로 사용하면 됨
  • dependencies: 의존하고 있는 디펜던시 목록. 하위에는 각 라이브러리마다 <dependency> 태그를 사용해 구분함
  • build: 빌드와 관련된 정보를 설정하는 영역

pom.xml이 JavaScript로 치면 package.json에서 관리하는 dependencies와 비슷한 것 같다고 생각됨

Gradle

  • Groovy 스크립트를 활용한 빌드 관리 도구. 안드로이드의 표준 빌드시스템으로 채택되어있다.
  • 멀티프로젝트의 빌드에 최적화되어있음
  • Maven에 비해 더 빠른 처리속도를 가지고, 더 간결한 구성이 가능하다.(xml이 불편한 것도 있고…)
  • 기존과 비교할 때 변경된 사항이 없으면 빌드를 패스하는 기능이 내장되어있다.(Gradle이 캐싱이 잘된다고 하던데, 그때문인가보다.)
  • Mavenpom.xml이 있다면 Gradlebuild.gradle이 있다.
  • Gradlegradle wrapper를 통해, 따로 설치없이 사용할 수도 있다.

Gradle의 대표 용어들

  • plugins: 여러 기능을 제공하기 위한 플러그인 설정

    • 참고로 java 플러그인은 자바 프로그램을 위한 기능을 제공하여 complieJava라는 태스크는 이덕분에 사용 가능하며 main/java, test/java 등 프로젝트 구조에 규칙이 생김.
    • apllication이라는 플러그인 덕분에 run이라는 응용프로그램 실행이 가능함
  • group: 프로젝트 생성 시의 groupId
  • version: 애플리케이션의 버전. 임의의 버전을 쓰면 됨(우리팀에서는 날짜를 쓰더라.)
  • sourceCompatibility: 자바 버전. 자바소스를 뭘로 컴파일할지이다. 자바 1.6이상에서는 sourceCompatibility이고 1.5 이하에서는 targetCompatibility이다.
  • buildscript > ext: 그 인자를 buildScript 에서 전역변수로 사용하기 위해 사용되는 메서드이다. 예컨대 Kotlin 버전 등을 갖다쓸 때 여기에 정의하는 듯
  • repositories: 라이브러리가 저장된 위치 등 설정(그 라이브러리가 어디에 있는지). mavenCentral()은 기본 메이븐 레포지토리를 의미한다.
  • dependencies: 디펜던시 설정

    • implementation: 일반적인 것
    • developmentOnly: 개발환경에서만
    • testImplementation: 테스트에서만

Gradle Lifecycle

  1. 초기화(init): 어느 프로젝트를 빌드하는지 결정하고 각각의 프로젝트들에 대해 Project 인스턴스를 생성한다. settings.gradle 파일의 내용이 실행되는 사이클이다.
  2. 구성(configure): 빌드과정 내 모든 프로젝트의 빌드 스크립트를 실행한다. 이를 통해 프로젝트 객체를 구성한다. build.gradle 파일의 내용이 실행되는 사이클이다.
  3. 실행(exec): 2. 구성 단계에서 생성하고 설정된 task 중 실행할 것을 결정한다.

Gradle 멀티프로젝트

  • setting.gradle은 gradle project의 root project에서 멀티프로젝트를 이어주는 역할을 한다.
  • rootProject.name은 루트프로젝트 이름을 정의하며, 이는 디렉토리명과는 무관하다고 한다.
  • 루트에 있는 build.gradle에서는 모든 서브 프로젝트에 공통된 설정을 넣을 수 있다.
  • 부모 프로젝트에서 서브 프로젝트의 행위를 정의하는 것도 가능하다.
  • allprojects는 말그대로 모든(전체) 프로젝트(현재 + 하위)를 의미한다. 반면 subprojects는 하위 프로젝트만 의미한다. project(':mobile') 이런식으로 하면 특정 프로젝트(이 예시에서는 mobile)만을 의미한다.
  • 서브프로젝트의 build.gradle에서 프로퍼티를 들고 있게 해서 그 값에 따라 조건문을 걸어 실행여부를 다르게 만들 수도 있다.
  • 프로젝트 경로를 지정할 때, 콜론(:)은 최상위 프로젝트를 의미한다. 마치 terminal에서 ~와 비슷한 느낌. 그 외엔 기본적으로 상대 경로로 인식한다. 이것도 terminal과 비슷함
  • 명시적으로 정의하지 않으면 Gradle은 알파벳 순서에 따라 태스크를 실행한다. 단, evaluationDependsOn 지정 혹은 task 내에 dependsOn 키워드를 이용해서 의존성(타 프로젝트)을 명시하면 디펜던시부터 실행된다.

[참고자료]
https://www.youtube.com/watch?v=3Jp9kGDb01g
https://kwonnam.pe.kr/wiki/gradle/multiproject