Objetivo do bloco buildscript em Gradle

236

Eu sou novo no Gradle e estou lendo a documentação, mas não entendo algumas partes dela. Uma dessas partes está conectada com o buildscriptbloco. Qual é seu propósito?

Se o script de construção precisar usar bibliotecas externas, você poderá adicioná-las ao caminho de classe do script no próprio script de construção. Você faz isso usando o método buildscript (), passando um fechamento que declara o caminho de classe do script de construção.

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
  }
}

Ok, mas qual é a diferença com:

repositories {
  mavenCentral()
}
dependencies {
  compile group: 'commons-codec', name: 'commons-codec', version: '1.2'
}

Por exemplo, por que é necessário usar buildscript?

Xelian
fonte
1
possível duplicata de dependências buildscript Gradle
fejese

Respostas:

178

O buildScriptbloco determina quais plug-ins, classes de tarefas e outras classes estão disponíveis para uso no restante do script de construção . Sem um buildScriptbloco, você pode usar tudo o que é fornecido com o Gradle pronto para uso. Se você deseja usar adicionalmente plug-ins de terceiros, classes de tarefas ou outras classes (no script de construção!), Você deve especificar as dependências correspondentes no buildScriptbloco.

Peter Niederwieser
fonte
2
Eu não consigo entender Em. Eu escrevi uma classe de tarefa com o grupo: sample.infotask', name: 'infotask', version: '1.0'E use a tarefa _uploadArchives para enviá-la para repositório local ../lib ' Em outro projeto, se eu usar minha tarefa, devo escrever: `buildscript {repositórios {arquivo maven {url': ../ lib '}} dependências {classpath group:' sample.infotask ', nome:' infotask ', versão:' 1.0 '}} Estou certo? Por que devemos usar o bloco buildScript ? Quando carrego artefato local, tenho o jar na minha máquina. E só tenho que dizer a Gradle de onde e o que colocar no meu caminho de classe, mais nada, qual é o especial aqui?
Xelian
40
Você deve usar um buildScriptbloco, porque Gradle precisa dessas informações para entender o restante do script de construção . É por isso que você precisa fornecer essas informações em um canal separado (o buildScriptbloco). Tecnicamente falando, Gradle precisa dessas informações para compilar e avaliar o restante do script de construção. O que acontece sob o capô é que Gradle separa o script de construção em dois scripts (o buildScriptbloco e tudo o mais) para que possa processá-los separadamente.
Peter Niederwieser
1
Se você ler este e-mail após ler outras respostas, poderá entender o que Pedro quer dizer (e é bastante correto). Mas a segunda linha - "Sem um bloco buildScript, você pode usar tudo o que é fornecido com o Gradle pronto para uso" - é o que torna o ans ambíguo.
Dexter
apenas uma nota rápida que me fez entender a coisa toda. ao usar "buildscript", você está dizendo que quaisquer dependências no buildscript {...} não são usadas pelo código / programa Java / Kotlin (ou o que você estiver usando). Mas, em vez disso, eles SOMENTE devem ser usados ​​por scripts gradle. Por exemplo, você precisa usar alguns plug-ins que não são fornecidos por padrão, depois adicioná-lo no buildscript {...} e poderá usá-lo apenas em scripts gradle. espero que ajude
cesarmax
153
  • O nível global dependenciese as repositoriesseções listam as dependências necessárias para criar e executar sua fonte, etc.
  • O buildscripté para o build.gradlepróprio arquivo. Portanto, isso conteria dependências para, por exemplo, a criação de RPMs Dockerfilee quaisquer outras dependências para executar as tarefas em todos os dependentes.build.gradle
Ashish
fonte
4
Todas as extensões para se classificar são encontradas através de dependências buildscript->, que por sua vez são baixadas da seção buildscript-> repositórios. buildscript bloco, é executado em primeiro lugar (compilação fase de preparação do sistema) antes de iniciar a execução de tarefa de criação como fonte de compilação etc
Raja Nagendra Kumar
4
buildscripté simplesmente a dependência para o seu script de construção
Slier
3
buildscript é devDependencies em node.js, nível superior = dependências.
1924 Jacob
67

Agradeço a resposta de Peter ... mas não foi imediatamente óbvio para mim o que o restante do script de construção quis dizer com ênfase na resposta e na documentação.

Normalmente, trazer funcionalidade dependente é para uso no programa Java ou qualquer outro programa que você possa estar escrevendo. Trazendo Spring dizer, não é para ser usado no script de construção, mas no programa Java. Colocá-lo no buildscriptfechamento garante que as dependências estejam disponíveis para uso na própria construção do gradle. Não é o programa de saída.

Daniel Gerson
fonte
8

A seção de configuração "buildscript" é para o próprio gradle (ou seja, altera a forma como o gradle é capaz de executar a construção). Portanto, esta seção geralmente inclui o plug-in Android Gradle.

Maulik Baraiya
fonte
2

É um pouco alto, mas a esperança ajuda.

Para mim, uma distinção clara começou a se formar quando eu comecei a entender o que é um componente básico , método e tarefa. Como é a sintaxe, como você pode configurá-los, etc. Então, sugiro que você analise tudo isso. Depois disso, você pode começar a entender essa sintaxe.

Então é muito importante saber qual é o tipo do objeto build.gradle (uma instância da classe Project) para saber o que você pode ter dentro de um arquivo build.gradle. Isso responderia de onde vêm esses 'buildScript' e outros. E para ampliar suas capacidades / recursos (digamos, android), veja como os plug-ins podem ajudar.

Por último, mas não menos importante, há um tutorial muito bom aqui que fala sobre fechamentos, delegados, que são os conceitos essenciais para entender o script.

stdout
fonte
1

Um pouco mais de explicação ao demonstrar o arquivo gradle de nível superior do Android.

buildscript {
    // this is where we are going to find the libraries defined in "dependencies block" at below
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }

    // everything listed in the dependencies is actually a plugin, which we'll do "apply plugin" in our module level gradle file.
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2' // this is android gradle plugin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // kotlin gradle plugin
    }
}

arquivo gradle no nível do módulo

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

O que é "plugin"? São apenas classes java, que implementam a interface Plugin. Sob a interface, ele possui um método "aplicar" para adicionar vários objetos de tarefas com nomes diferentes. Task é uma classe em que podemos implementar o fluxo de trabalho. Por exemplo, a tarefa de compilação consiste no fluxo de criação do aplicativo.

Então, o que o buildscript faz? Ele define onde encontrar os plugins. O que o plugin faz? Abrange várias tarefas. O que a tarefa faz? Ele nos fornece a compilação, instalação, fiapos etc.

Meu entendimento pode estar errado. Por favor, não hesite em me corrigir se achar que algo é enganoso.

KunYu Tsai
fonte