Gradle에서 transitive = true는 정확히 무엇입니까 (wrt crashlytics)?


174

Gradle transitive = true은 정확히 무엇을합니까? Gradle 문서 에서 명확하지 않습니다 . 이것은 compilewithin 의 맥락에 있습니다 build.gradle. 내 경우에는 안드로이드의 crashlytics에 의존하고 있습니다.

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

여러 Gradle 문서 ( herehere )는 "전이"가 기본값으로 true임을 나타냅니다. 그러나 제거 transitive = true하면 전이 의존성이 가져 오지 않습니다 (특히 KitGroup).

class file for io.fabric.sdk.android.KitGroup not found

문서는 기본값이 true라고 말하지만 실제 동작은 반대입니다.

Gradle 2.2.1을 실행 중입니다. 아마도 행동이 2.2와 2.4 사이에서 바뀌었을까요?

편집 : gradle을 사용하여 aar 라이브러리에 대해 관련 전이 종속성이 해결되지 않음


구성을 정의하거나 종속성을 정의 할 때?
dnault

jar 파일의 종속성이 하위 프로젝트로 승격됩니다. 모든 프로젝트가 종속성을 명시 적으로 정의 할 필요는 없습니다.
Konrad

이 문서 에서 명확하지 않은 것은 무엇입니까 ?
Oleg Estekhin

3
@OlegEstekhin 설명서가 내가보고있는 런타임 동작과 일치하지 않습니다
Steve Kuo

답변:


153

@aar표기법을 사용하고 있습니다.
즉, aar 아티팩트 만 다운로드하고 종속성은 다운로드하지 않으려 고합니다.
문서 부분을 ​​확인할 수 있습니다 : 섹션을
확인 1.4.1.2. Artifact only notation하십시오.

이슈 전용 표기법은 지정된 확장자를 가진 이슈 파일 만 다운로드하는 모듈 종속성을 만듭니다. 기존 모듈 설명자는 무시 됩니다.

@aar종속성을 다운로드 하려면 표기법을 사용 하여을 추가해야합니다 transitive=true.

@aar를 생략하면 전이 속성을 추가하지 않고 작동해야합니다.


7
@aar를 생략하고 전이 속성을 제거하는 것이 작동 함을 확인했습니다. 여기서 개발자는 Fabric 키트를 명시 적으로 참조하고 (예 : "compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'") 핵심 io.fabric.sdk.android 클래스를 통해 가져옵니다. 전이 의존성. transitive = false를 설정하면 컴파일 타임에 io.fabric.sdk.android.Fabric 클래스를 찾을 수 없습니다.
Mark McClelland 17

7
이 "기능"은 너무 나쁘다. 나는 그 의존성에 열중하고 싶다. @aar없이 그것은 항아리를 검색하고 불평
dowi

12

보다 일반적인 메모에서 : 설정 transitive = false상의 crashlytics라이브러리 원인에 필요한 모든 라이브러리 무시 Gradle을 crashlytics(= "과도 라이브러리")을 다운로드하고이를 연결하지.

필요한 라이브러리를 프로젝트에 수동으로 추가하거나 다른 종속성에 의해 추가 된 다른 임시 라이브러리에 의존해야합니다.

gradle의 기본값은 transitive = true입니다.

여기에 예와 전체 설명 : http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


링크가 작동하지 않습니다. 어떤 경우에는 구체적으로 참을 쓰기 때문에 기본적으로 참이 아닙니다.
Morozov

@Morozov 링크가 수정되었습니다. GOTCHA에 감사드립니다!
Vaiden

5

내 생각에 수동으로 참조하는 Crashlytics 아티팩트는 종속성을 전 이적 이지 않은 것으로 지정 transitive=false하여 기본적으로 이러한 종속성을 가져 오지 않아도됩니다. 이것이 바로 당신이 반대 행동을하는 이유입니다. 예를 들어 일부 개발자는 모든 Google Play 서비스 또는 Crashlytics가 제공하는 다른 도구를 사용하고 싶지 않을 수 있습니다.

따라서 Gradle을 제거하면 Gradle은 더 이상 종속성을 가져 오지 않으며 빌드하지 못합니다. 필요한 경우 해당 종속성을 수동으로 지정할 수 있습니다.

, 가장 큰 문제는 Crashlytics 아티팩트를 직접 참조해서는 안된다는 것입니다. Fabric을 사용하고 결과적으로 Crashlytics를 가져와야합니다. https://dev.twitter.com/fabric/ 안드로이드 / 통합


Fabric으로 마이그레이션하기위한 지침은 Fabric "kit"을 사용한다고 가정하고 Crashlytics 아티팩트를 직접 참조하도록 지정합니다. fabric.io/migrations/gradle
Mark McClelland

의도적으로 키트를 직접 참조하고 전이 의존성을 통해 io.fabric.sdk.android 클래스를 가져 오는 것 같습니다.
Mark McClelland

1

전이 종속성을 포함하거나 제외하여이 종속성을 해결해야하는지 여부를 설정합니다. 이 종속성에 속하는 아티팩트는 다른 아티팩트에 종속 될 수 있습니다. 후자를 전이 의존성이라고합니다.


1

Gradle은 기본적으로 전이 의존성을 따릅니다. 특정 라이브러리에 대해이를 끄려면 전이 플래그를 사용하십시오.

전이 플래그의 값을 false로 변경하면 전이 종속성의 다운로드가 방지되므로 필요한 모든 것을 추가해야합니다. 추가 종속성없이 모듈 jar 만 원하는 경우이를 지정할 수도 있습니다.


2
이것은 고도로 공감 된 답변의 조언을 넘어서 어떤 가치를 더했습니까?
hrbrmstr

-19

transitive전이성을 제어합니다. Gradle은 일반적으로 그렇지 않은 경우를 제외하고 기본적으로 전 이적입니다. 전이성 및 분류기에 버그가 있습니다 ( https://issues.gradle.org/browse/GRADLE-3188 참조) .


39
나는 당신이 버그를 지적하는 것이 공평하다고 생각합니다. 그러나 귀하의 속성 설명은 도움이되지 않습니다. "전이는 전이를 제어합니다. Gradle은 그렇지 않은 경우를 제외하고 일반적으로 전이로 기본 설정됩니다." 정말, 친구? ... 정말?
w3bshark

4
@ w3bshark 나는 그것이 재미 있다고 생각했다. "내가 그렇지 않은 경우를 제외하고는 기본적으로 전이로 설정되어 있습니다."
Navin

4
@ w3bshark 나는 투표에 대해 덜 신경 쓸 수 있었다. 내가 배운 것을 커뮤니티와 공유하고 있습니다.
Steve Kuo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.