사용자 도구

사이트 도구


gradle:organizing_build_logic

문서의 이전 판입니다!


Gradle Organizing Build Logic

  • Gradle에는 빌드 스크립트 로직을 구성하는 여러 가지 방법이 있다.
  • 태스크 클로저에 직접 넣기.
  • 여러 태스크가 동일 로직을 사용한다면 메소드로 빼서 호출한다. 멀티 프로젝트에서 이 로직을 사용한다면 부모 프로젝트에 메소드를 선언한다.
  • 메소드로 빼 빌드로직이 너무 복잡하다면 OO 모델로 바꿀 수 있다. 특정 디렉토리에 클래스를 넣어두면 Gradle이 자동으로 컴파일하여 빌드 스크립트 클래스패스에 추가한다.

프라퍼티와 메소드 상속

부모 프로젝트에 정의된 모든 메소드와 프라퍼티는 서브 프로젝트에서도 접근 가능하다. 이를 통해 공통 구성을 정의하고 빌드 로직을 메소드로 만들어서 서브 프로젝트에서 사용하도록 하면 된다.

  • build.gradle
    srcDirName = 'src/java'
     
    def getSrcDir(project) {
        return project.file(srcDirName)
    }
  • child/build.gradle
    task show << {
        // 상속받은 프라퍼티 사용
        println 'srcDirName: ' + srcDirName
     
        File srcDir = getSrcDir(project)
        println 'srcDir: ' + rootProject.relativePath(srcDir)
    }
  • 실행하면
    > gradle -q show
    srcDirName: src/java
    srcDir: child/src/java

구성 주입(Injected configuration)

상속보다는 Gradle Multi Project에 나온 교차 프로젝트 구성방식과 서브프로젝트 구성 방식이 더 좋다. 이유는 주입방식은 빌드 스크립트에서 명백하게 일어나고 서로 다른 프로젝트에 다른 로직을 주입할 수 있다. 그리고 리포지토리, 플러그인, 태스크와 기타 등등 모든 종류의 구성을 주입할 수 있다.

  • build.gradle
    subprojects {
        // 프라퍼티와 메소드를 주입한다.
        srcDirName = 'src/java' // 프라퍼티
        srcDir = { file(srcDirName) } // 메소드
     
        // Inject a task
        task show << {
            println 'project: ' + project.path
            println 'srcDirName: ' + srcDirName
            File srcDir = srcDir()
            println 'srcDir: ' + rootProject.relativePath(srcDir)
        }
    }
     
    //  특정 프로젝트에는 특수한 경우의 구성을 주입한다.
    project(':child2') {
        srcDirName = "$srcDirName/legacy"
    }
  • child1/build.gradle
    // 주입된 프라퍼티와 메소드를 사용하지만, 값은 덮어 쓴다.
    srcDirName = 'java'
    def dir = srcDir()
  • 실행하면
    > gradle -q show
    project: :child1
    srcDirName: java
    srcDir: child1/java
    project: :child2
    srcDirName: src/java/legacy
    srcDir: child2/src/java/legacy

buildSrc 프로젝트의 소스 빌드하기

Gradle을 실행하면 buildSrc라는 디렉토리가 존재하는지 검사한다. 존재한다면 자동으로 이 코드를 컴파일하고 테스트한 뒤에 빌드 스크립트의 클래스패스에 집어 넣는다. 그 외에 다른 것을 할 필요가 없다. 여기에 Custom TaskGradle Custom Plugins을 넣으면 된다.

멀티 프로젝트에서는 최상위 프로젝트에만 buildSrc를 둘 수 있다.

  • buildSrc의 기본 빌드 스크립트
    // build.gralde이 없어도 아래 빌드 스크립트가 존재하는 것으로 간주한다.
    apply plugin: 'groovy'
    dependencies {
        compile gradleApi()
        groovy localGroovy()
    }

이 말은 buildSrc에 기본 Java/Groovy 프로젝트를 구성할 수 있다는 뜻이다. Gradle Java Plugin, Gradle Groovy Plugin

좀 더 복잡한 것이 필요하다면 자신만의 build.gradle을 만들면 된다. Gradle은 기본 빌드 스크립트를 build.gradle이 있건 없건 무조건 적용한다. 즉, 빌드 스크립트에는 기본값 외에 다른 것만 정의하면 된다.

  • buildSrc/build.gradle
    repositories {
        mavenCentral()
    }
     
    // gradle과 groovy에 관한 의존성은 추가할 필요가 없다.
    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.8.2'
    }

buildSrc 프로젝트도 멀티 프로젝트 빌드가 될 수 있다. 하지만 실제 빌드의 클래스패스에 넣고자 하는 buildSrc 서브 프로젝트는 최상위 buildSrc 프로젝트의 runtime 의존성에 설정해야 한다.

  • 서브프로젝트를 최상위 buildSrc프로젝트에 넣기 build.gradle
    rootProject.dependencies {
      runtime project(path)
    }

공유 스크립트

gradle에서 “외부 빌드 스크립트로 프로젝트 구성하기” 참조.

커스텀 태스크

Custom Task 참조.

커스텀 플러그인

외부 빌드 실행

외부 라이브러리

gradle/organizing_build_logic.1349506826.txt.gz · 마지막으로 수정됨: 2012/10/06 16:00 저자 kwon37xi