다른 저장소가 없는 경우 Bintray/JCenter에서 마이그레이션
TL;DR 버전
Bintray/JCenter (또는 다른 유사한 서비스) 가 닫힌 후에 프로젝트에 필요한 라이브러리 (Maven dependency) 를 찾을 수 없지만, 로컬 Gradle 캐시에 있습니다. 이 라이브러리를 사용하여 로컬 Maven 저장소를 쉽게 만들 수 있으며, 교체로 사용할 수 있으며, 필요에 따라 문서를 보존할 수 있습니다. (자세한 정보는 see "Finding the cached dependencies in Gradle cache" 와 "Setting up a local Maven repository" 세그먼트를 참고하십시오.
그냥 배경이에요.
몇 달 전에 JFrogannounced it is sunsetting는 Bintray와 JCenter를 포함한 일부 서비스를 발표했는데 그 중에서 많은 의존 항목을 위탁 관리했다.MvnRepository에 따르면 JCenter의 경우841,529 indexed jars 최근 몇 년 동안 그 인기가 계속 증가하고 있습니다.🚀
사건의 놀라운 변화
Bintray와 JCenter는 2021년 5월 1일 문을 닫을 계획이었으나 4월 27일 JFrog는 "JCenter를 읽기 전용 저장소로 무기한 유지할 것"이라고 이들의 최초 공지를 업데이트했다.비록 그렇지만, 나는 더 이상 의존항을 방문할 수 없다.나는 그 중 일부는 JCenter에서 위탁 관리한 것이라고 생각한다. 적어도 MvnRepository의 말에 의하면 이렇다고 해서 나는 좀 놀랐다. 그러나 아마도 나는 다른 문제가 있을 것이다. 예를 들어 awrong order of the repositories declarations in Gradle(지금은 기억이 나지 않는다)😅).
어쨌든, 나의 의존항도 Bintray에 위탁되어 있기 때문에, 나는 Bintray와 JCenter에서 동시에 이전하는 것이 가장 좋다고 결정했다.그래서 나는 시도해 보았다. 처음에 나는 매우 비참하게 실패했다. 이것은 나로 하여금 이 문제를 해결하는 심상치 않은 방법을 찾게 했다.
이론과 실천
Bintray/JCenter 프로그램의 닫기와 이동 경로에 대한 블로그와 글을 읽을 때, 그들은 서로 다른 Maven 저장소로 간단하게 전환할 수 있다고 주장한다. (가장 좋은 것은 Maven Central)그들이 통상적으로 언급하지 않는 것은, 만약 당신이 성공한다면, 당신은 자신이 정말 운이 좋다고 생각할 것이다.
많은 경우, 어떤 이유로 전환할 수 없습니다. 예를 들어, 다른 Maven 저장소가 필요한 라이브러리를 위탁 관리하지 않거나, 라이브러리 작성자가 라이브러리의 비교적 새롭거나 곧 발표될 버전만 이전할 계획입니다.때때로 의존항 버전을 업데이트하는 것은 많은 번거로움을 가져오지 않습니다. 특히 직접 의존항에 익숙하고 호환성이 있습니다.이러한 의존항이 전달될 수 있거나, 새 버전이 클라이언트에서 대량의 추가 작업을 필요로 할 때, 이것은 더욱 어려워진다.
내가 해결할 수 없는 모든 의존 관계를 돌이켜 볼 때, 나는 이것이 공원에서 산책하는 것처럼 완전히 상반되는 것이 아니라는 것을 깨달았다.
어떻게 모든 부족한 의존항을 한 번에 찾을 수 있습니까
Gradle cache 덕분에 로컬에서 프로젝트를 구축할 수 있었지만 TeamCity의 자동 지속적인 통합 구축이 실패했습니다(이것도 제가 처음 발견한 문제입니다). 오류는 다음과 같습니다.
> Could not resolve com.datadoghq:dd-sdk-android:1.5.1.
Required by:
project :app > project :datadog
> Could not resolve com.datadoghq:dd-sdk-android:1.5.1.
> Could not get resource 'https://dl.bintray.com/datadog/datadog-maven/com/datadoghq/dd-sdk-android/1.5.1/dd-sdk-android-1.5.1.pom'.
> Could not GET 'https://dl.bintray.com/datadog/datadog-maven/com/datadoghq/dd-sdk-android/1.5.1/dd-sdk-android-1.5.1.pom'. Received status code 403 from server: Forbidden
다음 명령을 실행하면 해결할 수 없는 모든 의존 항목을 신속하게 찾을 수 있습니다../gradlew :app:dependencies | grep FAILED | grep -v "project :"
설명::app:dependencies
모든 프로젝트의 의존 관계를 간단하게 열거했다. 왜냐하면 app는 주요 응용 프로그램 모듈이기 때문이다grep FAILED
해석 불가능한 종속성만 인쇄할 수 있도록 출력 필터링 grep -v "project :"
필터 multi-project build에서 불필요한 모듈 의존항을 제거하고 이 의존항도 FAILED
로 보고할 수 있다.출력은 다음과 같을 수 있습니다(처음 10행).
| +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
| +--- com.google.android:flexbox:1.0.0 FAILED
+--- com.android.volley:volley:1.1.1 FAILED
| | +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
| +--- com.google.android:flexbox:1.0.0 FAILED
| +--- com.android.volley:volley:1.1.1 FAILED
| +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
| | +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
| +--- com.amitshekhar.android:debug-db:1.0.6 FAILED
| | | +--- com.google.android:flexbox:1.0.0 FAILED
다른 Maven 저장소에서 종속성 찾기
현재, 어떤 의존항이 부족한지 알면, MvnRepository 같은 서비스로 다른 Maven 메모리 라이브러리에서 그들을 위탁 관리하는지 확인할 수 있다.예를 들어 이러한 의존 관계의 경우
| +--- com.linkedin.dexmaker:dexmaker:2.21.0 FAILED
당신은 다음과 같은 것을 볼 수 있습니다.2.21.0
은 JCenter에서만 호스팅됩니다.2.28.1
은 Maven Central에 있습니다.이 경우 현재 의존 항목의 버전을 가져오려면 다른 Maven 저장소를 사용할 수 없지만, 업데이트를 시도할 수 있습니다.
참고로, Dexmaker의 관리자는 이전 버전을 이전하지 않을 것이라고 말했다.
전달 가능한 의존 항목 버전을 어떻게 강제로 집행합니까
대부분의 경우, Dexmaker는 직접적인 의존항이 아니라 전달할 수 있는 의존항이기 때문에, Gradle 프로필의 어느 곳에서 버전을 간단하게 변경할 수 없습니다.
전송 가능 종속 버전을 업데이트하려면 다음과 같이 MockK를 사용합니다.
dependencies {
constraints {
implementation("com.linkedin.dexmaker:dexmaker:2.28.1") {
because("The default version used by MockK 1.9.3 is hosted on JCenter only")
}
}
}
또는 다음과 같은 방법으로 constrains를 사용할 수 있습니다.allprojects {
configurations.all {
resolutionStrategy {
force("com.linkedin.dexmaker:dexmaker:2.28.1")
}
}
}
해결 전략 내가 다른 곳에서 찾을 수 없는 의존 관계
불행히도 이야기는 여기서 끝나지 않았다.의존 관계를 갱신하는 것은 진일보한 문제를 초래할 수 있다.그 중 일부는 서로 호환되지 않을 수도 있고, 다른 일부는 프로젝트의 일부 코드 부분을 업데이트해야 하기 때문에 많은 정력을 들여야 할 수도 있다.그 밖에 라이브러리 작성자가 더 이상 그것을 관리하지 않거나 다른 마븐 저장소, 예를 들어 마븐 Central에 업로드할 시간이 충분하지 않을 수도 있다.
이 모든 경우, 현재 의존 버전을 어떤 방식으로 유지해야 할 수도 있습니다.나는 다음 단락에서 어떻게 이 점을 해냈는지 설명할 것이니 계속 읽어 주십시오🙂.
나는 다른 곳에서 찾을 수 없는 다음과 같은 의존항을 보류하기로 결정했다.
com.datadoghq:dd-sdk-android:1.5.1
(직접)com.savvi.datepicker:rangepicker:1.3.0
(직접)com.google.android:flexbox:1.0.0
(및)전달할 수 있었어
com.android.volley:volley:1.1.1
(및)com.linkedin.dexmaker:dexmaker:2.21.0
(직접)Gradle 캐시에서 캐시 의존 항목 찾기
고맙습니다.Gradle은 의존항을 로컬에 캐시하기 때문에 모든 의존항을 쉽게 찾을 수 있습니다.기본적으로 사용자의 홈 디렉터리를 검사해야 합니다:
com.sunmi:printerlibrary:1.0.13
.
다음 명령을 실행하여 캐시된 종속 파일을 찾을 수 있습니다.
find ~/.gradle/caches/modules-2/files 2.1/com.linkedin.dexmaker
다음과 같은 출력이 인쇄됩니다./Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d/dexmaker-2.21.0-javadoc.jar
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56/dexmaker-2.21.0.pom
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3/dexmaker-2.21.0.jar
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82/dexmaker-2.21.0-sources.jar
이제 몇 걸음만 더 하면 당신의 VCS에 이 소중한 파일을 저장하고 팀원들과 공유할 수 있습니다.여기서 디렉터리 레이아웃에 대한 완전한 설명을 찾을 수 있습니다. 로컬 Maven 저장소 설정
다음 Gradle 코드 세그먼트를 사용하여 모든 디렉토리를 Maven 저장소로 사용할 수 있습니다.
repositories {
maven {
url = uri("${rootProject.projectDir}/libs")
}
}
~/.gradle
블록에 넣고 싶을 수도 있어요.)따라서 루트 항목 디렉토리의
allProjects { ... }
디렉토리는 다른 모든 Maven 저장소와 마찬가지로 종속 항목을 검색합니다.물론, 너는 이 목록을 마음대로 명명할 수 있다.선택한 디렉토리는 Maven 저장소 레이아웃에 따라 준비되어야 합니다.솔직히 말해서, 나는 이 주제에 관한 어떤 문서가 공식 문서인지 확실하지 않지만, 나는 로컬
libs
목록을 찾아서 답을 찾았다.Dexmaker에 대해 다음 디렉토리를 만들었습니다.
libs/com/linkedin/dexmaker/dexmaker/2.21.0
보시다시피, 저는Gradle 캐시 구조를 Maven 저장소 레이아웃에 비추었습니다. 아래와 같습니다.그레델 캐시
Maven 저장소
~/.gradle/caches/modules-2/files-2.1
libs
일반 도메인 이름 형식.영영아.텍스마르크
linkedin/dexmaker
텍스마르크
텍스마르크
2.21.0
2.21.0
그런 다음 다음 다음 명령을 사용하여 모든 파일을 Gradle cache에서
~/.m2/repository
로 복사합니다.find ~/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0 -type f -exec cp -v {} libs/com/linkedin/dexmaker/dexmaker/2.21.0 \;
출력을 인쇄했습니다./Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/bdfd84d002e265ab7cf7f54a71a17717f831a57d/dexmaker-2.21.0-javadoc.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0-javadoc.jar
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/423b7b6e4d772e274ba03646284b0cea83faca56/dexmaker-2.21.0.pom -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0.pom
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/680f2dbbb51f2892a4fdbbd9269d628e0b3270b3/dexmaker-2.21.0.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0.jar
/Users/azabost/.gradle/caches/modules-2/files-2.1/com.linkedin.dexmaker/dexmaker/2.21.0/2e6b7df791ab40f340dfd2cb41acd62bb057af82/dexmaker-2.21.0-sources.jar -> libs/com/linkedin/dexmaker/dexmaker/2.21.0/dexmaker-2.21.0-sources.jar
이것이 바로 Dexmaker 2.21.0이 Git 저장소의 일부가 된 이유입니다.모든 다른 부족한 의존항에 대해 이 과정을 반복한 후에 나는 다시 프로젝트를 성공적으로 구축하였다🎉저자 Andrzej Zabost, 고급 안드로이드 개발자@Bright Innovations
특색 있는 사진 작성자this oneLuroka
Reference
이 문제에 관하여(다른 저장소가 없는 경우 Bintray/JCenter에서 마이그레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/brightdevs/migrating-away-from-bintray-jcenter-when-there-is-no-alternative-repository-3l7m텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)