Base/CI, CD

Gradle 에서 SNAPSHOT 버전 의존성 관리

findmypiece 2023. 2. 2. 01:53
728x90

조직 내부에서 사용되는 라이브러리는 SNAPSHOT 버전으로 만들어서 내부 Nexus 에 저장해서 사용하곤 한다. 

 

빌드툴에서는 기본적으로 버전이 변경될 경우에만 원격저장소와 로컬저장소의 의존성을 비교해서 더 최근버전일 경우 로컬저장소로 다운로드해서 빌드에 활용한다.

 

하지만 내부에서 사용해서 수정이 잦은 라이브러리의 경우 매번 버저닝을 하기도 번거롭고 이를 사용하는 곳도 버저닝을 적용해야 하는 번거로움 때문에 버저닝 없이도 원격저장소와 로컬저장소를 비교하게 하고 싶을 수 있다. 이를 위한 pom.xml 설정이 아래와 같다.

<repositories>
    <repository>
      <id>...</id>
      <name>...</name>
      <url>...</url>
      <releases>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </releases>
      <snapshots>
        <enabled>true</enabled>
        <updatePolicy>always</updatePolicy>
      </snapshots>
    </repository>
</repositories>

 

updatePolicy 가 언제 원격저장소와 로컬저장소를 비교할지에 대한 설정인데 SNAPSHOT 버전은 이렇게 지정하지 않더라도 기본적으로 updatePolicy 가 always 로 지정되어 있다.

 

물론 이는 maven 저장소 한정이고 Ivy 저장소에는 해당되지 않기 때문에 위와 같이 명시적으로 지정해주는 것이 안전하긴 하다.

 

Gradle 에서는 아래와 같이 지정할 수 있다.(Kotlin DSL)

implementation("...:1.0-SNAPSHOT") {
    isChanging = true
}

isChanging true 가 Maven 에서의 updatePolicy always와 동일한 의미이다. Gradle 에서도 SNAPSHOT 버전은 기본적으로 isChanging이 true 지만 역시 maven 저장소 한정이라 명시적으로 지정해주는 좋다.

 

그런데 Gradle 에서는 아래 설정이 추가로 필요하다.

configurations.all {
    resolutionStrategy.cacheChangingModulesFor(0, "seconds")
}

Gradle 에서는 Changing 의존성을 캐싱해서 사용하고 캐싱하는 동안에는 당연히 확인을 하지 않는다. 이에 정확히 매번 체크하고 싶다면 위와 같이 설정해서 캐싱을 하지 않도록 해야 한다.

728x90