Gradle - obtendo a versão mais recente de uma dependência

93

Qual seria a maneira mais fácil de dizer Gradleo seguinte:

Recupere a dependência 'junit' e obtenha sua versão de 'lançamento' mais recente.

Gerenciar repositórios Maven e Ivy é meio novo para mim. Tentei os seguintes passos e resultaram em Could not resolve dependency ...erro:

  • Escreva compile "junit:junit:latest.release"com repositórios definidos como apenas mavenCentral() (no entanto, funciona se eu disser "junit: junit: 4.10").

  • Escreva compile "junit:junit:latest.release"com repositório definido da seguinte maneira:

    ivy {
        // I also tried 'http://maven.org' and other possible variants.           
        url "http://repo1.maven.org" 
        layout "maven"
    }
    
  • Tentativa de usar o repositório Spring Source Ivy:

    ivy {
        artifactPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
        ivyPattern "http://repository.springsource.com/ivy/libraries/release/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
    }
    

Talvez eu tenha entendido mal alguma coisa. Por que obter a versão mais recente da dependência seria uma tarefa tão difícil?

Yippie-Ki-Yay
fonte
A versão dinâmica pode ser um espaço reservado para a versão mais recente disponível latest.integration. documentação do gradle para versões dinâmicas
Bhavik

Respostas:

48

Atualmente, o Gradle não oferece suporte ao Maven RELEASE(que raramente é usado e obsoleto), mas oferece suporte ao Ivy latest.release. No entanto, a recomendação geral é construir contra versões exatas. Caso contrário, a construção pode se tornar uma loteria.

Peter Niederwieser
fonte
O Maven também não oferece suporte a RELEASE. Apenas números de versão fixos.
khmarbaise
10
Eu verifiquei duas vezes. O Maven é compatível RELEASE, tanto na versão 2 quanto na 3.
Peter Niederwieser
Você está certo. Eu me enganei com as versões do plugin, pois no Maven 3 ele não permite mais RELEASE / LATEST. Mas é claro que é uma má prática usar esses identificadores de versão.
khmarbaise
Um artefato em um repositório de lançamento do Maven é aquele que concluiu todos os testes automatizados possíveis (e talvez manuais). Esse processo deve incluir verificações de compatibilidade de API, testes de regressão e assim por diante. Por que então a construção pode se tornar uma loteria? Somente se você estiver "liberando" artefatos que não foram suficientemente testados.
RCross
2
A nota suporta 'latest.release' (mas não 'RELEASE'). Isso é extremamente útil para garantir que suas próprias bibliotecas internas estejam na versão mais recente e comprovada - é claro que nunca defenderia seu uso para bibliotecas externas / de terceiros pelo mesmo motivo que Peter sugeriu acima.
RCross
257

Às vezes, pode ser muito útil obter a versão mais recente - se, por exemplo, você lança frequentemente suas próprias dependências.

Você pode obter a versão mais recente, como

compile "junit:junit:+"

ou melhor especificar pelo menos a versão principal, como

compile "junit:junit:4.+"
jmruc
fonte
27
só para constar: deveriam ser aspas duplas! Tenho usado aspas simples para a maioria das minhas declarações de dependência e descobri que code 'junit:junit:4.+'não funciona
azonli
1
@azonli parece funcionar para mim com aspas simples, pelo menos para dependências locais. Que erro você obteve?
David Moles,
3
não deveria ser "testCompile" em vez de "compilar"? porque o artefato não é necessário em uma versão
Martin Dürrmeier
6
Você nem sempre precisa de uma construção reproduzível.
Lakatos Gyula
2
@SimonForsberg ... É verdade, no entanto, quando você está sob-desenvolvimento você pode querer (a) seguir o sangramento de ponta ou (b) garantir correções de bugs para v 4.+são mantidos atualizados para o seu projeto. Quando você atinge o estágio Alpha, Beta, -RC ou -RELEASE; Eu concordo totalmente que você precisa ' pregar ' essas versões em um poste. Eu uso uma properties' file to set version specifiers: compilação "junit: junit: $ { junitVer }" `.
será em
25

Verifique o Gradle-Versions-Plugin. Ele faz exatamente o que você deseja: https://github.com/ben-manes/gradle-versions-plugin

Para a instalação, consulte a página do github. Basicamente, você precisa adicionar essas duas linhas ao arquivo build.gradle - project:

apply plugin: 'com.github.ben-manes.versions'

buildscript {
    [...]
    dependencies {
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.8'
        [...]
    }
}
[...]

Então você pode usar o plug-in, executando este comando no terminal no diretório do seu projeto:

./gradlew dependencyUpdates -Drevision=release

E vai mostrar quais dependências estão desatualizadas!

electronix384128
fonte
Você também pode adicionar isso a um initscript se não quiser incluir o plug-in em todos os seus projetos. Veja esta resposta a outra pergunta para detalhes.
Laurence Gonsalves
e se as dependências estiverem no mesmo repo e você sempre quiser a versão mais recente?
Barry Kelly
8

O Guia do usuário do Gradle mais recente menciona e explica as versões de sinal de adição:

De 7.2. Declarando suas dependências :

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}

... O script de construção também afirma que qualquer junit> = 4.0 é necessário para compilar os testes do projeto.

De 23,7. Como funciona a resolução de dependências :

Se a dependência for declarada como uma versão dinâmica (como 1. +), o Gradle resolverá isso para a versão estática mais recente disponível (como 1.2) no repositório. Para repositórios Maven, isso é feito usando o arquivo maven-metadata.xml, enquanto para repositórios Ivy isso é feito por listagem de diretório.

RunninglVlan
fonte
1
Dica importante: o + não leva necessariamente a versão mais recente. Veja meu comentário acima.
Harry G.
3

No Android Studio:

Se você estiver usando +para a versão e quiser saber qual versão está realmente sendo usada , selecione Projectna barra lateral e, em seguida External Libraries, verá o número da versão real em uso.

lenooh
fonte
Você está se referindo a um IDE específico? :-)
Inego
Inego: sim, eu adicionei à resposta ;-)
lenooh