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?


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.


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.+"

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!


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.


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.


Você está se referindo a um IDE específico? :-)
Inego

Inego: sim, eu adicionei à resposta ;-)
lenooh
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.