문서의 이전 판입니다!
부모 프로젝트에 정의된 모든 메소드와 프라퍼티는 서브 프로젝트에서도 접근 가능하다. 이를 통해 공통 구성을 정의하고 빌드 로직을 메소드로 만들어서 서브 프로젝트에서 사용하도록 하면 된다.
> gradle -q show srcDirName: src/java srcDir: child/src/java
상속보다는 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
Gradle을 실행하면 buildSrc
라는 디렉토리가 존재하는지 검사한다. 존재한다면 자동으로 이 코드를 컴파일하고 테스트한 뒤에 빌드 스크립트의 클래스패스에 집어 넣는다. 그 외에 다른 것을 할 필요가 없다. 여기에 Custom Task와 Gradle 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 참조.
GradleBuild 태스크를 를 사용하여 다른 빌드의 태스크를 실행할 수 있다. dir
혹은 buildFile
프라퍼티로 실행할 빌드를 지정하고 tasks
프라퍼티로 실행할 태스크를 지정할 수 있다.
build.gradle
task build(type: GradleBuild) { buildFile = 'other.gradle' tasks = ['hello'] }
other.gradle
task hello << { println "hello from the other build." }
> gradle -q build hello from the other build.