在Gradle中构建脚本块的目的

我是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?

85159 次浏览

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

我很欣赏彼得的回答……但是在回答和文档中强调的构建脚本的其余部分的意思对我来说并不是很明显。

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

  • 全局级别的dependenciesrepositories部分列出了构建源代码和运行源代码等所需的依赖项。
  • buildscript用于build.gradle文件本身。因此,这将包含创建rpm、Dockerfile以及在所有依赖build.gradle中运行任务的任何其他依赖项

“buildscript”配置部分是针对gradle本身的(即更改gradle如何能够执行构建)。本节通常包括Android Gradle插件。

这有点高,但希望会有所帮助。

对我来说,一旦我开始理解积木、方法和任务是什么,就开始形成了清晰的区别。语法如何,如何配置等等。我建议你们把这些都看一遍。在此之后,您可以开始理解这种语法。

那么,了解对象构建的类型是非常重要的。gradle (Project类的一个实例),以便了解在构建中可以有什么。gradle文件。这将回答'buildScript'和其他来自哪里。为了扩展你的功能/特性(比如说android),看看插件是如何帮助的。

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

通过演示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是做什么的呢?它定义了在哪里找到插件。插件是做什么的?它包含多个任务。task是做什么的?它为我们提供了构建、安装、lint等。

我的理解可能错了。如果你发现任何误导,请不要犹豫纠正我。

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

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

构建脚本的外部依赖项

而不是操作 脚本类路径直接,建议应用插件即 自带自己的类路径。对于自定义构建逻辑,使用 建议使用自定义插件。如果您的构建脚本需要 要使用外部库,可以将它们添加到脚本的类路径中 在构建脚本本身中。您可以使用buildscript()来完成此操作 方法,传入一个声明构建脚本类路径的块 传递给buildscript()方法的块配置一个ScriptHandler实例。 类的依赖项声明构建脚本类路径 类路径配置。这和你声明for是一样的 例如,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)
}
}
你可以把buildScript块想象成Gradle核心的内容,就像plugins{}块已经在Gradle内部了。 因此,所有来自父build.gradlebuildScript的插件将在所有嵌套的build.gradle模块中可用

我相信buildscript {}中的所有内容都将可用于当前构建脚本本身及其所有子项目。

对于在buildscript {}之外的文件本身声明的属性,它不会立即对给定项目本身的buildscript可用,而是对其所有子项目可用。

  • 因此,如果你想声明一些东西并立即将其用于buildscript本身(当前的buildscript而不仅仅是子项目的buildscript),在当前项目的buildscript {}中声明它们,它也有副作用,让子项目以后使用它。

  • 如果你只是想全局声明一些东西(对于子项目的__abc0),你可以直接在父项目中声明它们为ext {}。父项目不能将它们用于自己的buildscript,但它可以用于所有子项目,无论在buildscript子句内还是在buildscript子句外。

例如,在父项目中:

ext {
kotlin_version_XX = '1.7.10'
}


buildscript {
ext {
kotlin_version = '1.7.10'
}
// kotlin_version will be available here since declared in buildscript{}
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"


// will NOT be available here -- error due to kotlin_version_XX declared in project
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version_XX"
}

如果你有子项目:


dependencies {
   

// both kotlin_version and kotlin_version_XX can be used here, since it was declared in parent project
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version_XX"
}


buildscript {
    

// both kotlin_version and kotlin_version_XX can even be used here for subproject's script's use, since it was already declared in parent project
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version_XX"
}