O que Gradle transitive = true
faz exatamente? Não está claro na documentação do Gradle . Isso está no contexto de compile
dentro build.gradle
. No meu caso, estou dependendo dos travamentos do Android.
compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
transitive = true;
}
Vários documentos de Gradle ( aqui e aqui ) sugerem que "transitivo" é o padrão "true". No entanto, a remoção transitive = true
resulta em dependências transitivas que não são trazidas (em particular KitGroup
).
class file for io.fabric.sdk.android.KitGroup not found
Os médicos dizem que o padrão é verdadeiro, mas o comportamento real parece ser o oposto.
Estou executando o Gradle 2.2.1. Talvez o comportamento tenha mudado entre 2,2 e 2,4?
Edit : dependências transitivas relacionadas não resolvidas para aar library usando gradle
java
android
gradle
build.gradle
crashlytics
Steve Kuo
fonte
fonte
Respostas:
Você está usando a
@aar
notação.Isso significa que você deseja fazer o download apenas do artefato aar e sem dependências.
Você pode verificar esta parte da documentação :
Verifique a
1.4.1.2. Artifact only notation
seção:Usando a
@aar
notação se você deseja fazer o download das dependências, você deve adicionartransitive=true
.Eu esperava que a omissão de @aar funcionasse sem adicionar o atributo transitivo.
fonte
Em uma observação mais geral: a configuração
transitive = false
nacrashlytics
biblioteca faz com que o gradle ignore todas as bibliotecas requeridas porcrashlytics
(= "transient libraries") e não faça o download e vincule-as.Você precisaria adicionar manualmente as bibliotecas necessárias ao seu projeto ou confiar em outras bibliotecas transitórias adicionadas por outras dependências.
O padrão para gradle é
transitive = true
.Exemplos e explicação completa aqui: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
fonte
Meu palpite é que o artefato Crashlytics ao qual você está se referindo manualmente especifica dependências como não transitivas (
transitive=false
), para que você não seja forçado a trazer essas dependências por padrão. É por isso que você está vendo o comportamento oposto. Por exemplo, alguns desenvolvedores podem não querer usar todos os serviços do Google Play ou qualquer outra coisa que o Crashlytics possa usar, se presente.Portanto, removendo isso, Gradle não extrai mais a dependência e falha ao criar. Você pode especificar essa dependência manualmente, se precisar.
Dito isto - acho que o maior problema em questão é que você não deve fazer referência diretamente ao artefato Crashlytics - você deve usar o Fabric e puxar o Crashlytics como resultado: https://dev.twitter.com/fabric/ android / integração
fonte
Define se essa dependência deve ser resolvida, incluindo ou excluindo suas dependências transitivas. Os artefatos pertencentes a essa dependência podem ter dependências de outros artefatos. Os últimos são chamados de dependências transitivas.
fonte
Gradle segue dependências transitivas por padrão. Se você deseja desativar isso para uma biblioteca específica, use o sinalizador transitivo.
Alterar o valor do sinalizador transitivo para falso impede o download de dependências transitivas; portanto, você precisará adicionar o que for necessário. Se você deseja apenas um jar de módulo, sem nenhuma dependência adicional, também pode especificar isso.
fonte
transitive
controla transitividade. O padrão Gradle normalmente é transitivo, exceto quando não é. Há um erro com transitividade e classificadores, consulte https://issues.gradle.org/browse/GRADLE-3188 .fonte