281

我是 Gradle 的新手,我正在阅读文档,但我不明白其中的某些部分。这些部分之一与buildscript块连接。它的目的是什么?

如果您的构建脚本需要使用外部库,您可以将它们添加到构建脚本本身的脚本类路径中。您可以使用 buildscript() 方法执行此操作,传入一个声明构建脚本类路径的闭包。

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

好的,但有什么区别:

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

例如,为什么有必要使用buildscript

4

7 回答 7

203

buildScript块确定哪些插件、任务类和其他类可用于构建脚本的其余部分。没有buildScript块,你可以使用 Gradle 附带的所有东西,开箱即用。如果您还想使用第三方插件、任务类或其他类(在构建脚本中!),您必须在buildScript块中指定相应的依赖项。

于 2013-07-21T15:37:48.960 回答
177
  • 全局级别dependenciesrepositories部分列出了构建源代码和运行源代码等所需的依赖项。
  • buildscriptbuild.gradle文件本身。因此,这将包含用于创建 RPM的依赖项Dockerfile,以及用于在所有依赖项中运行任务的任何其他依赖项build.gradle
于 2015-02-27T17:23:25.823 回答
79

我很欣赏彼得的回答......但对我来说,构建脚本的其余部分在答案和文档中所强调的含义并不是很明显。

通常引入相关功能是为了在 Java 程序或您可能正在编写的任何其他程序中使用。引入 Spring 说,不是在构建脚本中使用,而是在 Java 程序中使用。将它放在buildscript闭包中可确保依赖项可在 gradle 构建本身中使用。不是输出程序。

于 2014-11-29T18:48:31.260 回答
9

通过演示 Android 顶级 gradle 文件进行更多解释。

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
    }
}

模块级 gradle 文件

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

什么是“插件”?它们只是实现 Plugin 接口的 java 类。在界面下,它有一个方法“apply”来添加多个不同名称的任务对象。Task 是一个我们可以实现工作流的类。例如,构建任务包括构建应用程序的流程。

那么,buildscript 有什么作用呢?它定义了在哪里可以找到插件。插件有什么作用?它包含多项任务。任务是做什么的?它为我们提供了构建、安装、lint 等。

我的理解可能有误。如果您发现任何误导性内容,请随时纠正我。

于 2019-08-05T09:11:36.287 回答
8

“buildscript”配置部分是针对 gradle 本身的(即更改 gradle 执行构建的方式)。所以这个部分通常会包含 Android Gradle 插件。

于 2016-06-28T14:05:21.973 回答
3

它有点高,但希望有所帮助。

对我来说,一旦我开始了解什么是构建块、方法和任务,就会开始形成清晰的区别。语法是什么样的,如何配置它们等等。所以我建议你通过所有这些。之后,您就可以开始理解这种语法了。

那么了解对象 build.gradle(Project 类的一个实例)的类型是非常重要的,这样才能知道 build.gradle 文件中有什么。这将回答“buildScript”和其他人的来源。并扩展您的功能/特性(比如说 android),看看插件如何提供帮助。

最后但并非最不重要的一点是,这里有一个非常好的教程,它讨论了闭包和委托,它们是理解脚本所必需的概念。

于 2018-01-23T10:51:35.020 回答
1

buildscript块用于构建脚本,而不是用于 gradle 构建输出(例如,Android 应用 apk)。在下面的代码示例中,编码代码用于构建脚本中,而不是在 gradle 构建输出程序中;所以应该将依赖项添加到buildscript块中。

https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:build_script_external_dependencies

构建脚本的外部依赖项

建议使用自带类路径的插件,而不是直接操作脚本类路径。对于自定义构建逻辑,建议使用自定义插件。如果您的构建脚本需要使用外部库,您可以将它们添加到构建脚本本身的脚本类路径中。您可以使用 buildscript() 方法执行此操作,传入一个声明构建脚本类路径的块。

传递给 buildscript() 方法的块配置了一个 ScriptHandler 实例。您可以通过将依赖项添加到类路径配置来声明构建脚本类路径。这与声明 Java 编译类路径的方式相同。您可以使用除项目依赖项之外的任何依赖项类型。

声明了构建脚本类路径后,您可以像使用类路径上的任何其他类一样使用构建脚本中的类。以下示例添加到前面的示例,并使用构建脚本类路径中的类。

import org.apache.commons.codec.binary.Base64

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

tasks.register('encode') {
    doLast {
        def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
        println new String(encodedString)
    }
}
于 2021-09-24T06:33:24.937 回答