【问题标题】:Purpose of buildscript block in GradleGradle 中 buildscript 块的用途
【发布时间】: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

【问题讨论】:

标签: classpath gradle


【解决方案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 脚本上使用它。希望有帮助
            猜你喜欢
            • 2018-05-18
            • 2012-12-05
            • 2013-06-07
            • 2015-08-18
            • 1970-01-01
            • 2018-01-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多