Contents

  • Basic Usage
  • Using an init script
  • Writing an init script
  • External dependencies for the init script
  • Init script plugins

Gradle 提供了有力的机制让你基于当前环境定制构建 …
此机制同样支持想要和Gradle 集成的工具 …
注意这和”init”任务完全不同,”init”任务由Build Init Plugin[TODO]插件提供 …

Basic Usage

初始化脚本,也称为 “init” 脚本 … 类似于Gradle 中的其他脚本 … 这些脚本可以在构建开始之前运行 ..
有几种可能的使用方式:

  • 配置企业级的配置,例如发现自定义的插件 …
  • 基于当前的环境配置属性,例如开发者机器 vs 持续集成服务器
  • 提供了此构建所需要的关于用户的个人信息,例如仓库或者数据库认证凭证 …
  • 定义了特定于机器的详情,例如JDK 安装信息 ..
  • 注册构建监听器.. 外部工具想要监听Gradle 实现可能会发现很有用 ..
  • 注册构建日志器 .. 你可能想要定制Gradle 如何记录这些生成的事件 ..

这个脚本的唯一限制就是 它不能够访问位于buildSrc 项目中的类 ..Using buildSrc to extract 命令式逻辑 了解这个特性的详情 ..

使用 init 脚本

这里有几种使用初始化脚本的方式

  • 在命令行指定文件

-I / —init-script 指定这个脚本的路径
这个命令行选项能够出现一次或者多次,每一个词可以增加其他的初始化脚本 …
这个构建将会失败,如果在命令行上的指定的其他文件没有出现的话…

  • 创建一个叫做 init.gradle(init.gradle.kts kotlin) 放置在USER_HOME/.gradle 目录中
  • 放置以.gradle 结尾的文件或者以(.init.gradle.kts - kotlin)结尾的文件到 USER_HOME/.gradle/init.d 目录中 ..
  • 放置一个.gradle 或者(.init.gradle.kts - kotlin) 到GRADLE_HOME/init.d/目录中 ..

这允许你打包一个自定义的Gradle 发行,具有某些自定义构建逻辑以及插件 ..
你能够合并 The Gradle Wrapper[TODO] 使用 让你的自定义逻辑对于所有构建都生效 ..

编写一个init 脚本

类似于Gradle 构建脚本,一个初始化脚本可以是Groovy 或者Kotlin 脚本 …
每一个初始化脚本都有一个与它联系的Gradle 实例 …
此脚本中的任何方法调用或者属性引用将会代理到Gradle 实例上 …
每一个初始化脚本实现了Script接口

从初始化脚本中配置项目

你能够使用初始化脚本配置构建中的项目 …
这个工作类似于配置多项目构建的项目 … 以下的示例展示了如何执行额外的配置(来自初始化脚本) - 在项目评估之前 … 执行 ..
这个例子使用这个特性配置为项目配置额外的仓库(仅仅被用来某些环境中) …

Using init script to perform extra configuration before projects are evaluated

  1. repositories {
  2. mavenCentral()
  3. }
  4. tasks.register('showRepos') {
  5. doLast {
  6. println "All repos:"
  7. println repositories.collect { it.name }
  8. }
  9. }
  1. allprojects {
  2. repositories {
  3. mavenLocal()
  4. }
  5. }

其实初始化脚本等同于构建脚本,它们都可以使用顶级DSL 闭包 …
应用这个初始化脚本的输出:

  1. > gradle --init-script init.gradle -q showRepos
  2. All repos:
  3. [MavenLocal, MavenRepo]

初始化脚本的外部依赖 …

为构建脚本增加外部依赖示例中解释了如何增加额外的依赖到构建脚本 …
同样初始化脚本也可以声明依赖,你能够通过 initscript() 方法,并且传递一个闭包进行调用 来声明 初始化脚本的类路径 ..

Declaring external dependencies for an init script

  1. initscript {
  2. repositories {
  3. mavenCentral()
  4. }
  5. dependencies {
  6. classpath 'org.apache.commons:commons-math:2.0'
  7. }
  8. }

这个闭包将会传递给initscript方法,配置ScriptHandler ..
你能够声明初始化脚本的类路径,通过增加依赖到classpath 配置上 …
这与声明 Java 编译类路径的方式相同。
你能够使用任何依赖类型 - 点此(查看如何声明的依赖) … 除了项目依赖 …e
当你声明了初始化脚本的类路径 .. 你能够在初始化脚本中使用这些类(因为这些类都在类路径上) …

使用外部依赖的初始化脚本

  1. import org.apache.commons.math.fraction.Fraction
  2. initscript {
  3. repositories {
  4. mavenCentral()
  5. }
  6. dependencies {
  7. classpath 'org.apache.commons:commons-math:2.0'
  8. }
  9. }
  10. println Fraction.ONE_FIFTH.multiply(2)
  1. tasks.register('doNothing')

输出:

  1. gradle --init-script init.gradle -q doNothing
  2. > 2 / 5

结果将得出5分之2 ..

初始化脚本插件

类似于Gradle 构建脚本或者Gradle settings文件,插件也能够使用在初始化脚本中 …

Using plugins in init scripts

  1. apply plugin: EnterpriseRepositoryPlugin
  2. class EnterpriseRepositoryPlugin implements Plugin<Gradle> {
  3. private static String ENTERPRISE_REPOSITORY_URL = "https://repo.gradle.org/gradle/repo"
  4. void apply(Gradle gradle) {
  5. // ONLY USE ENTERPRISE REPO FOR DEPENDENCIES
  6. gradle.allprojects { project ->
  7. project.repositories {
  8. // Remove all repositories not pointing to the enterprise repository url
  9. all { ArtifactRepository repo ->
  10. if (!(repo instanceof MavenArtifactRepository) ||
  11. repo.url.toString() != ENTERPRISE_REPOSITORY_URL) {
  12. project.logger.lifecycle "Repository ${repo.url} removed. Only $ENTERPRISE_REPOSITORY_URL is allowed"
  13. remove repo
  14. }
  15. }
  16. // add the enterprise repository
  17. maven {
  18. name "STANDARD_ENTERPRISE_REPO"
  19. url ENTERPRISE_REPOSITORY_URL
  20. }
  21. }
  22. }
  23. }
  24. }

直接配置 需要使用的仓库仅仅是企业本身的仓库 …

  1. repositories{
  2. mavenCentral()
  3. }
  4. tasks.register('showRepositories') {
  5. doLast {
  6. repositories.each {
  7. println "repository: ${it.name} ('${it.url}')"
  8. }
  9. }
  10. }

查看所有的仓库得出

  1. > gradle --init-script init.gradle -q showRepositories
  2. repository: STANDARD_ENTERPRISE_REPO ('https://repo.gradle.org/gradle/repo')

在init 脚本中的插件确保仅仅只有指定的仓库能够在运行构建时使用 ..

当在初始化脚本中应用插件,Gradle 实例化这个插件并且调用插件实例的Plugin.apply(T)方法 ..
这个gradle 对象将会作为 参数传入 … 它能够被用于配置构建中的所有方面 ..
当然,这个应用的插件 能够作为外部依赖进行解析点击查看