Como / quando gerar arquivos wrapper Gradle?

212

Estou tentando entender como o Gradle Wrapper funciona. Em muitos repositórios de origem, vejo a seguinte estrutura:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Minhas perguntas:

  1. Como / quando alguém gera gradlew/ gradlew.bat? Você deveria gerá-los apenas uma vez quando o projeto foi criado, você os gera toda vez que confirma / envia alterações? E como eles são gerados?
  2. Mesma pergunta acima, mas para os gradle/wrapper/*arquivos ( gradle-wrapper.jare gradle-wrapper.properties)?
  3. Algumas vezes, vejo outros *.gradlearquivos dentro do gradlediretório do projeto . O que são esses arquivos Gradle adicionais e o que eles representam / fazem? Plugins personalizados?
  4. Qual é a diferença de propriedades inseridas settings.gradleversus o que deve ser definido por dentro gradle.properties?
smeeb
fonte

Respostas:

250
  1. Você o gera uma vez e novamente quando deseja alterar a versão do Gradle usada no projeto. Não há necessidade de gerar tantas vezes. Aqui estão os documentos. Apenas adicione uma wrappertarefa ao build.gradlearquivo e execute-a para obter a estrutura do wrapper.

    Lembre-se de que você precisa ter o Gradle instalado para gerar um invólucro. Uma ótima ferramenta para gerenciar artefatos do ecossistema g é o SDKMAN! . Para gerar um wrapper gradle, adicione o seguinte pedaço de código ao build.gradlearquivo:

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    e corra:

    gradle wrapper
    

    tarefa. Adicione os arquivos resultantes ao SCM (por exemplo, git) e a partir de agora todos os desenvolvedores terão a mesma versão do Gradle ao usar o Gradle Wrapper.

    Com o Gradle 2.4 (ou superior), você pode configurar um wrapper sem adicionar uma tarefa dedicada:

    gradle wrapper --gradle-version 2.3
    

    ou

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Todos os detalhes podem ser encontrados aqui

A 3.1 --distribution-typeopção Gradle também pode ser usada. As opções são binárias e all e bin . todos contêm adicionalmente código fonte e documentação. tudo também é melhor quando o IDE é usado, para que o editor funcione melhor. A desvantagem é que a compilação pode durar mais tempo (é necessário fazer o download de mais dados, sem sentido no servidor de CI) e ocupará mais espaço.

  1. Esses são os arquivos do Gradle Wrapper. Você precisa gerá-los uma vez (para uma versão específica) e adicionar ao controle de versão. Se você precisar alterar a versão do Gradle Wrapper, altere a versão na seção build.gradle(1.) e gere novamente os arquivos.

  2. Dê um exemplo detalhado. Esse arquivo pode ter vários propósitos: projeto de vários módulos, separação de responsabilidades, script ligeiramente modificado etc.

  3. settings.gradleé responsável pela estrutura do projeto (módulos, nomes, etc), enquanto gradle.propertiesé usado pelos detalhes externos do projeto e do Gradle (versão, argumentos de linha de comando -XX, propriedades etc.)

Opala
fonte
Obrigado @Opal (+1) - para dar um exemplo específico para o item 3, consulte Netflix-Eureka . O que são esses arquivos Gradle?!?
smeeb
Ok, eu vejo. Tanto quanto vejo, os desenvolvedores da Netflix apenas dividiram um grande build.gradlescript em vários scripts mais curtos e dedicados a um propósito específico. Como o script localizado em gradle dir é aplicado ao build.gradlearquivo principal , consulte: github.com/Netflix/eureka/blob/master/build.gradle . Onde você coloca esses módulos é de sua escolha. Isso é tudo em geral. Se você estiver satisfeito com a resposta por favor, aceite a resposta :)
Opal
1
Outra opção útil da linha de comando é --distribution-type, por exemplo,gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee 15/11
1
Obrigado @heenenee, irá adicioná-lo à minha resposta.
Opala
Dica: o Android Studio possui um Gradle em sua pasta de instalação.
TWIStErRob
29

Gerando o Wrapper Gradle

Projeto construir gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Em seguida, na linha de comando, execute

gradle wrapper

Se estiver faltando o gradle no seu sistema, instale-o ou o acima não funcionará. Em um Mac, é melhor instalar via Homebrew.

brew install gradle

Depois de executar com êxito a tarefa do wrapper e gerada gradlew, não use a classificação do sistema. Isso poupará muitas dores de cabeça.

./gradlew assemble

E o plug-in gradle visto acima?

com.android.tools.build:gradle:1.0.1

Você deve definir a versão como a mais recente e pode verificar a página de ferramentas e editar a versão de acordo.

Veja o que o Android Studio gera

A adição do gradle e o mais recente Android Studio mudaram drasticamente o layout do projeto. Se você tem um projeto mais antigo, recomendo criar um projeto limpo com o Android Studio mais recente e ver o que o Google considera o projeto padrão.

O Android Studio possui recursos para importar projetos mais antigos, o que também pode ajudar.

Cameron Lowell Palmer
fonte
gradleVersion = '2.2'no taskWrapperpode usar qualquer versão que eu desejo para gerar o wrapper, correto? Não precisa ser a versão mais recente do gradle?
raffian
1
Suponho que você possa voltar nas 2 séries do gradle. Não tenho certeza antes do 2.x, mas não, ele não precisa seguir a versão mais recente.
Cameron Lowell Palmer
18

No Gradle 2.4, você pode usar gradle wrapper --gradle-version X.Xpara configurar uma versão específica do wrapper Gradle, sem adicionar tarefas ao seu build.gradlearquivo. Na próxima vez que você usar o wrapper, ele fará o download da distribuição Gradle apropriada para corresponder.

Craig Trader
fonte
10

Se você deseja fazer o download do gradle com código-fonte e documentos, o URL de distribuição padrão configurado em gradle-wrapper.properites não atenderá às suas necessidades. É https://services.gradle.org/distributions/gradle-2.10-bin.zip , Não https://services.gradle.org/distributions/gradle-2.10-all.zip . Este URL completo é sugerido pelo IDE, como o Android Studio. Se você deseja fazer o download da nota completa, é possível configurar a tarefa do wrapper como esta :

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
fonte
1
Com compilações mais recentes de Gradle (não sei exatamente qual) - em vez de reescrever manualmente a url, é provavelmente melhor usar o comando embutido no mesmo fechamento: distributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Este é o comando a ser usado para informar ao Gradle para atualizar o wrapper, de modo que ele pegue as versões de distribuição das bibliotecas que incluem o código-fonte:

./gradlew wrapper --gradle-version <version> --distribution-type all

A especificação do tipo de distribuição com "all" garantirá que o Gradle faça o download dos arquivos de origem para uso em seu ambiente de desenvolvimento.

Prós :

  • Os IDEs terão acesso imediato ao código fonte. Por exemplo, o Intellij IDEA não solicitará que você atualize seus scripts de construção para incluir a distribuição de origem (porque esse comando já fez isso)

Contras :

  • Processo de compilação mais longo / maior porque está baixando o código-fonte. Isso é um desperdício de tempo / espaço em uma compilação ou servidor de IC em que o código-fonte não é necessário.

Comente ou forneça outra resposta se você souber de alguma opção de linha de comando para informar ao Gradle para não baixar fontes em um servidor de compilação.

Shorn
fonte
1
Tem certeza de que essa configuração é sobre bibliotecas? Os documentos oficiais dizem o contrário e referem-se apenas ao próprio invólucro: "O tipo de distribuição Gradle a ser usado pelo invólucro". docs.gradle.org/current/dsl/…
Thorsten Schöning
2
  1. Você irá gerá-los uma vez, mas atualize-os se precisar de um novo recurso ou algo de um plugin que, por sua vez, precise de uma versão mais recente do gradle.

    Maneira mais fácil de atualizar: a partir do Gradle 2.2, basta baixar e extrair a distribuição completa ou binária do Gradle e executar:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Não há necessidade de definir uma tarefa, embora você provavelmente precise de algum tipo de build.gradlearquivo.

    Isso atualizará ou criará o wrapper gradlewand gradlew.bat, além de gradle/wrapper/gradle-wrapper.propertiese gradle-wrapper.jarpara fornecer a versão atual do gradle, empacotado.

  2. Tudo isso faz parte do invólucro.

  3. Alguns build.gradlearquivos referenciam outros arquivos ou arquivos em subdiretórios que são subprojetos ou módulos. Fica um pouco complicado, mas se você tem um projeto, basicamente precisa do arquivo.

  4. settings.gradlelida com projeto, módulo e outros tipos de nomes e configurações, gradle.propertiesconfigura variáveis ​​reutilizáveis ​​para seus arquivos gradle, se você quiser e achar que elas seriam mais claras dessa maneira.

dlamblin
fonte
2

Como as tarefas internas gradle estão obsoletas no 4.8, tente abaixo

wrapper {
   gradleVersion = '2.0' //version required
}

e corra

gradle wrapper
drafterr
fonte