ChatGPT解决这个技术问题 Extra ChatGPT

Gradle 中 buildscript 块的用途

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

如果您的构建脚本需要使用外部库,您可以将它们添加到构建脚本本身的脚本类路径中。您可以使用 buildscript() 方法执行此操作,传入一个声明构建脚本类路径的闭包。 buildscript { repositories { mavenCentral() } 依赖项 { 类路径组:'commons-codec',名称:'commons-codec',版本:'1.2' } }

好的,但有什么区别:

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

例如,为什么需要使用 buildscript

Gradle buildscript dependencies 的可能重复项

P
Peter Niederwieser

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


我无法理解艾姆。我用 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 脚本上使用它。希望能帮助到你
A
Ashish

全局级别的依赖项和存储库部分列出了构建源代码和运行源代码等所需的依赖项。

buildscript 用于 build.gradle 文件本身。因此,这将包含创建 RPM、Dockerfile 和任何其他依赖项以运行所有依赖 build.gradle 中的任务的依赖项


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

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

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


K
KunYu Tsai

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

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


M
Maulik Baraiya

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


s
stdout

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

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

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

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


s
situee

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