Gradle에서 저장소 아티팩트를 허용 목록에 추가하기 위한 빠른 가이드

배경



일반적인build.gradle 파일은 다음과 유사한 방식으로 리포지토리를 나열합니다.

repositories {
   google()
   mavenCentral()
}


이것은 우리가 사용하는 종속성을 위의 리포지토리 중 하나에서 가져와야 함을 지정하는 빠른 방법입니다.

이 접근 방식에는 몇 가지 잠재적인 문제가 있습니다.
  • 보안, 예: 악의적인 행위자가 우리가 필요로 하는 것으로 가장하는 종속성을 배치한 경우 스크립트가 이를 다운로드할 수 있지만 우리는 알 수 없습니다.
  • 느림: 스크립트는 각 종속성의 정확한 좌표를 알지 못하며 맨 위부터 시작하여 각 저장소에서 검색합니다.

  • 더 나은 방법



    몇 년 전 Gradle은 각 종속 항목의 정확한 위치를 지정할 수 있는 기능을 추가했습니다.
    이러한 API에는 includeModule , includeGroup , includeGroupByRegex 가 포함됩니다.

    좋은 소식은 이러한 API로 점진적으로 마이그레이션하고 종속성 해결을 즉시 더 안전하고 빠르게 만들 수 있다는 것입니다.

    첫 번째 접근



    가장 쉬운 방법은 각 저장소를 includeGroupByRegex 항목 세트로 바꾸는 것입니다.

    우리 프로젝트가 Retrofit과 OkHttp를 사용하고 있다고 가정해 봅시다.

    1단계: 저장소 섹션에서 mavenCentral()를 제거합니다.

    2단계: 다음 방법 중 하나로 종속성을 강제로 새로 고칩니다.
  • 프로젝트 동기화,
  • 실행 ./gradlew --refresh-dependencies ,
  • 앱/테스트 실행,
  • 컴퓨터에서 .m2.gradle/caches 폴더를 제거하십시오.

  • Android Studio에서 다음과 유사한 오류가 표시됩니다.

       > Could not find com.squareup.okhttp3:okhttp:3.12.1.
         Required by:
             project :app
       > Could not find com.squareup.okhttp3:okhttp-urlconnection:.
         Required by:
             project :app
       > Could not find com.squareup.retrofit2:retrofit:2.9.0.
    


    3단계: 누락된 모든 파일에는 동일한 그룹 ID가 있습니다. com.squareup
    4단계: mavenCentral() 대신 아래를 추가하고 종속성을 다시 새로 고칩니다(2단계 참조).

       mavenCentral {
          content {
             includeGroupByRegex("com.squareup.*")
          }
      }
    


    5단계: 모든 종속성이 안전한 목록에 표시될 때까지 같은 방식으로 계속합니다. google() 에 대해서도 동일한 작업을 수행합니다.

    이 단계에서 멈출 수 있습니다. 종속성 해결이 더 안전하고 빠릅니다.

    includeGroup으로 조금 더 나아가기


    includeGroupincludeGroupByRegex 의 보다 정확한 버전입니다.

    제거includeGroupByRegex("com.squareup.*")하고 오류를 다시 검사해 보겠습니다. 그룹 이름을 볼 수 있습니다. 그것들을 사용하고 교체합시다:

    includeGroupByRegex("com.squareup.*")
    


    ~와 함께

     includeGroup("com.squareup.retrofit2")
     includeGroup("com.squareup.okhttp3")
    


    모든 includeGroupByRegex 에 대해 이를 반복합니다.

    종속성 해결은 아직 더 안전하고 빠릅니다. 여기서 멈출 수 있습니다.

    궁극적인 버전 - 다음을 사용: includeModule



    이제 각각includeGroup을 하나씩 제거하고 오류를 다시 검사하십시오. 오류 콘솔에 표시된 그룹 및 모듈 이름만 사용하면 됩니다includeModule(). 이것을 사용하고 교체합시다:

    includeGroup("com.squareup.retrofit2")
    


    ~와 함께

    includeModule("com.squareup.retrofit2", "retrofit")
    includeModule("com.squareup.retrofit2", "converter-gson")
    includeModule("com.squareup.retrofit2", "retrofit-mock")
    


    모든 includeGroup 에 대해 이를 반복합니다.
    결과 빌드 스크립트 파일은 상당히 크지만 리포지토리와 앱에 포함되는 항목을 완전히 제어할 수 있습니다.

    결론



    우리는 우리 자신의 속도로 마이그레이션할 수 있습니다. 바로 includeModule를 사용하거나 일반 저장소에서 includeGroupByRegex, includeGroup, 마지막으로 includeModule로 점진적으로 전환할 수 있습니다.

    위의 include 를 혼합하여 사용할 수도 있습니다.

    일반 리포지토리를 include 세트로 교체하는 한 종속성 해결이 더 빠르고 안전합니다. 그리고 우리는 우리 앱에 무엇이 들어가는지 정확히 알게 될 것입니다.

    추가 읽기:
  • https://docs.gradle.org/5.1.1/userguide/declaring_repositories.html
  • https://commonsware.com/blog/2021/02/20/using-repository-safelist-gradle.html
  • https://jebware.com/blog/?p=573
  • 좋은 웹페이지 즐겨찾기