Gradle中buildscript块的目的


235

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


Answers:


178

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


2
我听不懂Em。我用sample.infotask', name: 'infotask', version: '1.0'编写了一个任务类并使用_uploadArchives任务将其上载到本地仓库../lib'在另一个项目中,如果我使用我的任务,我必须编写:buildscript {仓库{maven {url'file:../ lib'}}依赖关系{类路径组:'sample.infotask',名称:'infotask',版本:'1.0'}}我对吗?为什么我们必须使用buildScript块?当我在本地上传工件时,我的机器上有jar。只需告诉Gradle从何处以及在我的类路径中放什么,就没有什么特别之处了?
Xelian

40
您必须使用一个buildScript块,因为Gradle需要此信息才能了解其余的构建脚本。这就是为什么您必须在单独的通道(此buildScript块)中提供此信息的原因。从技术上讲,Gradle需要此信息才能编译和评估其余的构建脚本。实际情况是,Gradle将构建脚本分为两个脚本(buildScript块和其他所有脚本),以便它可以分别处理它们。
Peter Niederwieser

1
如果您在阅读完其他答案后又读了此ans,则可以理解Peter想要说的话(而且非常正确)。但是第二行-“没有buildScript块,您可以直接使用Gradle附带的所有内容”-是使ans模糊的原因。
Dexter

只是一个简短的注释,使我理解了整个事情。使用“ buildscript”时,您是说Java / Kotlin代码/程序(或您使用的任何东西)不使用buildscript {...}中的任何依赖项。但是,它们只能用于gradle脚本。因此,例如,您需要使用默认情况下未提供的某些插件,然后将其添加到buildscript {...}中,并且只能在gradle脚本上使用它。希望对您有帮助
cesarmax

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

4
gradle本身的所有扩展都可以通过buildscript->依赖关系找到,而依赖关系又从buildscript->存储库部分下载。buildscript块,开始生成任务的执行诸如源编译等之前第一(构建系统准备阶段)中运行
拉加Nagendra库马尔

4
buildscript只是您的构建脚本的依赖关系
slier 18'May

3
buildscript是node.js中的devDependencies,顶层=依赖关系。
雅各布

67

我很欣赏Peter的回答...但是,对于我来说,并没有立即明白答案和文档中强调的其余构建脚本的含义。

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



2

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

对我来说,一旦我开始理解什么是构件,方法和任务,就开始形成明显的区别。语法看起来如何,如何配置它们等等。所以我建议您仔细阅读所有这些内容。之后,您就可以开始理解此语法了。

然后,了解对象build.gradle的类型(Project类的实例)非常重要,这样才能知道build.gradle文件中可以包含什么。那将回答“ buildScript”和其他来源的来源。并扩展您的功能(例如android),请参阅插件如何提供帮助。

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


1

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

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

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

我的理解可能是错误的。如果您发现任何误导性内容,请立即纠正我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.