Gradle 中 buildscript 块的用途

Posted

技术标签:

【中文标题】Gradle 中 buildscript 块的用途【英文标题】:Purpose of buildscript block in Gradle 【发布时间】:2013-07-20 09:01:15 【问题描述】:

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

【问题讨论】:

Gradle buildscript dependencies的可能重复 【参考方案1】:

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)
    

【讨论】:

【参考方案2】:

通过演示 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 等功能。

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

【讨论】:

【参考方案3】:

水平有点高,但希望有所帮助。

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

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

我很欣赏 Peter 的回答...但对于我来说,构建脚本的其余部分 的含义并没有立即显而易见,正如答案和文档中所强调的那样。

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

【讨论】:

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

【讨论】:

gradle 本身的所有扩展都是通过 buildscript-> 依赖项找到的,而这些依赖项又是从 buildscript-> repositories 部分下载的。 buildscript 块,在开始执行构建任务(例如源编译等)之前首先运行(构建系统准备阶段)。 buildscript 只是构建脚本的依赖项 buildscript 是 node.js 中的 devDependencies,top-level = dependencies.【参考方案7】:

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

【讨论】:

我听不懂 Em。我用 group: sample.infotask', name: 'infotask', version: '1.0' 编写了一个任务类,并使用 _uploadArchives 任务将其上传到本地 repo ../lib' 如果我使用我的任务在另一个项目中,我必须写:`buildscript repositories maven url 'file:../lib' dependencies classpath group: 'sample.infotask', name: 'infotask', version: '1.0' 我对吗?为什么我们必须使用 buildScript 块?当我在本地上传工件时,我的机器上有 jar。只需要告诉 Gradle 从哪里以及在我的类路径中放入什么,没有其他什么特别之处? 您必须使用 buildScript 块,因为 Gradle 需要此信息才能了解构建脚本的其余部分。这就是为什么您必须在单独的频道(buildScript 块)中提供此信息的原因。从技术上讲,Gradle 需要这些信息来编译和评估构建脚本的其余部分。幕后发生的事情是,Gradle 将构建脚本分成两个脚本(buildScript 块和其他所有脚本),以便它可以单独处理它们。 如果您在阅读其他答案后阅读此答案,您可以理解彼得想说的(并且非常正确)。但是第二行——“没有 buildScript 块,你可以使用 Gradle 附带的所有东西,开箱即用”——是使 ans 模棱两可的原因。 只是一个简短的说明,让我理解了整个事情。使用“buildscript”时,您是说 Java/Kotlin 代码/程序(或您正在使用的任何内容)不使用 buildscript ... 中的任何依赖项。但相反,它们仅供 gradle 脚本使用。因此,例如,您需要使用一些默认情况下未提供的插件,然后将其添加到 buildscript ... 中,您将只能在 gradle 脚本上使用它。希望有帮助

以上是关于Gradle 中 buildscript 块的用途的主要内容,如果未能解决你的问题,请参考以下文章

build.gradle 中的 buildscript 和 allprojects 有啥区别?

Gradle中的buildScript代码块

Gradle buildscript 依赖项

如何下载非依赖工件作为语义版本控制的 buildScript 块的一部分

AndroidStudio中Project下的build.gradle没有buildscript和allprojects了

对于 Maven 存储库凭据,buildscript 中的 Gradle 变量为空