O que transitive = true em Gradle faz exatamente (wrt crashlytics)?

174

O que Gradle transitive = truefaz exatamente? Não está claro na documentação do Gradle . Isso está no contexto de compiledentro 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 = trueresulta 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

Steve Kuo
fonte
ao definir configurações ou ao definir dependências?
dnault 30/07/2015
As dependências dos arquivos jar são promovidas para subprojetos. Nem todo projeto precisa definir suas dependências explicitamente.
Konrad
O que exatamente não está claro nesta documentação ?
Oleg Estekhin 30/07/2015
3
@OlegEstekhin a documentação não corresponde ao comportamento de tempo de execução que estou vendo
Steve Kuo

Respostas:

153

Você está usando a @aarnotaçã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 notationseção:

Uma notação apenas de artefato cria uma dependência de módulo que baixa apenas o arquivo de artefato com a extensão especificada. Os descritores de módulo existentes são ignorados .

Usando a @aarnotação se você deseja fazer o download das dependências, você deve adicionar transitive=true.

Eu esperava que a omissão de @aar funcionasse sem adicionar o atributo transitivo.

Gabriele Mariotti
fonte
7
Confirmei que omitir @aar e remover o atributo transitivo funciona. A intenção aqui é que os desenvolvedores façam referência explicitamente aos kits Fabric (por exemplo, "compile 'com.crashlytics.sdk.android:crashlytics:2.5.5'") e que as principais classes io.fabric.sdk.android sejam acessadas via dependência transitiva. Se você definir transitive = false, a classe io.fabric.sdk.android.Fabric não será encontrada em tempo de compilação.
Mark McClelland
7
esse "recurso" é tão ruim que eu quero um aar com suas dependências. sem a @aar ele procura frasco e reclama
dowi
12

Em uma observação mais geral: a configuração transitive = falsena crashlyticsbiblioteca faz com que o gradle ignore todas as bibliotecas requeridas por crashlytics(= "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/

Vaiden
fonte
link não funciona. Receio que não é por padrão verdadeiro, porque em alguns casos especificamente escrever verdade
Morozov
Link @Morozov corrigido. Obrigado pelo GOTCHA!
Vaiden
5

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

Sam Dozor
fonte
As instruções para a migração para o tecido especificar referenciando os Crashlytics artefato diretamente, presumindo que você está usando esse tecido "kit": fabric.io/migrations/gradle
Mark McClelland
Parece que a intenção é que você faça referência diretamente aos kits, e eles puxam as classes io.fabric.sdk.android por dependência transitiva.
Mark McClelland
1

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.

user6703435
fonte
1

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.

Hongyuan
fonte
2
Que valor isso agregou além do conselho na resposta altamente votada?
Hrbrmstr # 9/16
-19

transitivecontrola 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 .

Steve Kuo
fonte
39
Eu acho justo que você apontou um bug. Mas sua descrição da propriedade não é útil. "transitivo controla transitividade. Gradle normalmente assume o padrão transitivo, exceto quando não o faz." Sério, cara? ... Sério?
W3bshark
4
@ w3bshark Eu pensei que era engraçado. "o padrão é transitivo, exceto quando não" é bastante preciso na minha experiência.
Navin
4
@ w3bshark Eu poderia me importar menos com os votos. Estou compartilhando o que aprendi com a comunidade.
Steve Kuo