[컴] gradle 에서 여러 profile 을 사용하는 법

 

여러 profile 을 사용하는 방법 / mavne to gradle / convert / 변환 / 여러 property 사용 방법 / howto / 여러 profile 사용 / 어떻게 profile 마다 다른 properties 를 불러오기 /

gradle 에서 여러 profile 을 사용하는 법

기본적으로 gradlew build 를 하면, 모든 src\main\resources\*.properties file들이 \build\resources\main\' 에 복사되어지는데, 이때 각 file 마다 expand(https://docs.gradle.org/current/dsl/org.gradle.language.jvm.tasks.ProcessResources.html#org.gradle.language.jvm.tasks.ProcessResources:expand(java.util.Map) 작업을 해주게 된다.

processResources {

    filesMatching("**/*.properties" ) {
        println "expanding (marker replacement) " + it

        expand(activatedProperties: 'prod')
    }
}

expand

만약 application.properties 에 다음처럼 적어놓으면, ${activatedProperties ?: 'local'} 에 대한 처리를 해준다.

# src\main\resources\application.properties
spring.application.name=myapp
spring.profiles.active=${activatedProperties ?: 'local'}

즉, 최종적으로 build/resources/main/application.properties 파일은 아래처럼 생성된다.

# build/resources/main/application.properties
spring.application.name=myapp
spring.profiles.active=prod

여러 profile 사용

gradle 에서는 -P 옵션으로 여러 profile 을 사용할 수 있다.

gradlew -PbuildProfile=prod build

이것을 이용해서 여러 다른 값을 할당하게 할 수 있다.

다만 주의할점은 resource 가 copy 돼야만, processResources가 동작하기 때문에, 대체로 build 하기전에 clean 을 하고 build 를 해야만, processResources 의 내용이 동작할 것이다.

// build.gradle
...
if (!hasProperty('buildProfile')) ext.buildProfile = 'local' 
apply from: "profile-${buildProfile}.gradle"

processResources {
    filesMatching("**/*.properties" ) {
        println "expanding (marker replacement) " + it
        expand(activatedProperties2: project.buildId)
    }
}
// profile-local.gradle
ext.buildId = 'local'
// profile-prod.gradle
ext.buildId = 'prod'

maven pom.xml

이것을 maven 의 pom.xml 로 구현하면 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>
<project ...>
    ...
    <profiles>
        <profile>
            <id>local</id>
            <properties>
                <activatedProperties>local</activatedProperties>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <activatedProperties>prod</activatedProperties>
            </properties>
        </profile>
    </profiles>
# src\main\resources\application.properties
spring.application.name=myapp
spring.profiles.active=@activatedProperties@
/src/main/resources
  |
  + application-local.properties
  |
  \ application-prod.properties

See Also

  1. Resource Filtering with Gradle - DZone

댓글 없음:

댓글 쓰기