원문 - Structuring and Building a Software Component with Gradle


  • 멀티 프로젝트 빌드 만들기(Creating a multi-project build)
  • 서브프로젝트 추가(Adding subprojects)
  • 네이밍 권장사항(Naming recommendations)

그레이들을 사용하여 소프트웨어 컴포넌트 구조화 및 빌드기(Structuring and Building a Software Component with Gradle)

그레이들을 사용하여 특정 크기의 소프트웨어를 구축하는 경우, 두 가지 기본 구조화 메커니즘이 있다. 먼저 이 장에서는 그레이들 멀티 프로젝트를 사용하여 소프트웨어 프로젝트를 구성하는 방법을 설명한다. 이 문서에서는, 멀티 프로젝트를 내부적으로 구성된 단일 소프트웨어 컴포넌트로 간주한다. 둘째, 해당 소프트웨어는 각 컴포넌트가 별도의 그레이들 빌드로 표시되어 여러 소프트웨어 컴포넌트로 구성된 소프트웨어 제품으로 간주될 수도 있다. 이에 대한 자세한 내용은 그레이들 사용한 소프트웨어 제품 구성 장에 설명되어 있다.

멀티 프로젝트 빌드 만들기(Creating a multi-project build)

그레이들의 멀티 프로젝트(multi-project) 빌드는 하나의 루트 프로젝트와 하나 이상의 서브 프로젝트(subproject)로 구성된다.

기본 멀티 프로젝트 빌드에는 루트 프로젝트와 단일 서브 프로젝트가 포함된다. 아래 예제는 app이라는 단일 서브 프로젝트를 포함하는 멀티 프로젝트 빌드의 구조다.

예제 1. 기본 다중 프로젝트 빌드

Groovy Project layout

.
├── app
   ...
   └── build.gradle
└── settings.gradle

Kotlin Project layout

.
├── app
   ...
   └── build.gradle.kts
└── settings.gradle.kts

이는 그레이들 프로젝트를 시작하는 데 권장되는 프로젝트 구조다. 빌드 초기화 플러그인은 또한 이 구조를 따르는 뼈대 프로젝트(단일 서브 프로젝트가 있는 루트 프로젝트)를 생성한다.

루트 프로젝트에는 그레이들 빌드 파일이 없으며 포함할 서브 프로젝트를 정의하는 세팅 파일만 있다.

settings.gradle

rootProject.name = 'basic-multiproject'
include 'app'

settings.gradle.kts

rootProject.name = "basic-multiproject"
include("app")

이 경우 그레이들은 app 디렉토리에서 빌드 파일을 찾는다.

gradle projects 명령을 실행하면 멀티 프로젝트 빌드의 구조를 볼 수 있다.

> gradle -q projects

------------------------------------------------------------
Root project 'basic-multiproject'
------------------------------------------------------------

Root project 'basic-multiproject'
\--- Project ':app'

To see a list of the tasks of a project, run gradle <project-path>:tasks
For example, try running gradle :app:tasks

애플리케이션 플러그인을 적용하고 메인 클래스를 구성하고 app 서브 프로젝트가 Java 애플리케이션이라고 가정해 보자.

app/build.gradle

plugins {
    id 'application'
}

application {
    mainClass = 'com.example.Hello'
}

app/build.gradle.kts

plugins {
    id("application")
}

application {
    mainClass.set("com.example.Hello")
}

app/src/main/java/com/example/Hello.java

package com.example;

public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, world!");
    }
}

그런 다음 애플리케이션 플러그인에서 run 태스크을 실행하여 애플리케이션을 실행할 수 있다.

> gradle -q run
Hello, world!

이것은 기본 멀틴 프로젝트 빌드를 생성하는 것이 얼마나 간단한지 보여준다.

서브프로젝트 추가(Adding subprojects)

이전에 생성된 프로젝트에 lib라는 다른 서브 프로젝트를 추가한다고 가정해 보자. 우리가 해야 할 일은 루트 세팅 파일에 다른 include 문을 추가하는 것뿐이다.

settings.gradle

rootProject.name = 'basic-multiproject'
include 'app'
include 'lib'

settings.gradle.kts

rootProject.name = "basic-multiproject"
include("app")
include("lib")

그런 다음 그레이들은 프로젝트의 lib/ 하위 디렉토리에서 새 하위 프로젝트에 대한 빌드 파일을 찾는다.

예제 2. 두 개의 서브 프로젝트가 있는 멀티 프로젝트 빌드

Groovy Project layout

.
├── app
   ...
   └── build.gradle
├── lib
   ...
   └── build.gradle
└── settings.gradle

Kotlin Project layout

.
├── app
   ...
   └── build.gradle.kts
├── lib
   ...
   └── build.gradle.kts
└── settings.gradle.kts

다음으로, 서브 프로젝트 간 빌드 로직을 공유하는 방법서브 프로젝트가 서로 의존하는 방법을 살펴보자.

명칭 권장사항(Naming recommendations)

프로젝트가 성장함에 따라 명칭 지정과 일관성이 점점 더 중요해진다. 빌드를 유지 관리 가능하게 하려면 다음을 권장한다.

  1. 서브 프로젝트에 대한 기본 프로젝트명 유지: 세팅 파일에서 커스텀 프로젝트명을 구성할 수 있다. 그러나 개발자가 어떤 프로젝트가 어떤 폴더에 속하는지 불필요하게 추적해야 한다.
  2. 모든 프로젝트명에 케밥 대소문자 형식 사용: 케밥 대소문자 형식은 모든 문자가 소문자이고 단어가 대시(‘-‘) 문자(예:kebab-case-formatting)로 구분된 경우다. 이는 이미 많은 대규모 프로젝트의 패턴이다. 게다가 그레이들은 케밥 케이스 이름에 대한 이름 약어를 지원한다.
  3. 세팅 파일에서 루트 프로젝트명을 정의하자. ‘rootProject.name’은 빌드 스캔과 같은 보고서에 사용되는 빌드 전체에 이름을 효과적으로 할당한다. 루트 프로젝트명이 설정되지 않은 경우 이름은 컨테이너 디렉토리명이 되어 불안정할 수 있다(즉, 프로젝트를 어떤 디렉토리에서든 체크아웃할 수 있음).