Gradle 1.12用户指南翻译——第六十章. 初始化脚本

来源:互联网 发布:文华期货趋势指标源码 编辑:程序博客网 时间:2024/06/06 02:56
其他章节的翻译请参见:
http://blog.csdn.net/column/details/gradle-translation.html
翻译项目请关注Github上的地址:
https://github.com/msdx/gradledoc
本文翻译所在分支:
https://github.com/msdx/gradledoc/tree/1.12。
直接浏览双语版的文档请访问:
http://gradledoc.qiniudn.com/1.12/userguide/userguide.html。
另外,Android 手机用户可通过我写的一个程序浏览文档,带缓存功能的,目前0.6开发中版本兼容 Android 2.3以上系统,项目地址如下:
https://github.com/msdx/gradle-doc-apk
翻译不易,转载请注明本文在CSDN博客上的出处:

http://blog.csdn.net/maosidiaoxian/article/details/70941864

关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。如发现翻译有误的地方,将首先在以上两个地方更新。因时间精力问题,博客中发表的译文基本不会同步修改。

另外,目前Gradle1.12版本的文档已经翻译完并进入校稿阶段,校稿的方式为到该项目https://github.com/msdx/gradledoc 提交issue或是pull request。校稿的结果不只是在此版本更新,也会用于改善Gradle下一版本(2.0)文档的翻译。


第六十章. 初始化脚本

Gradle提供了一种强大的机制,可以让你基于当前的环境自定义构建。这种机制还支持希望与Gradle集成的工具。

60.1. 基本用法

初始化脚本 (也称为init scripts和Gradle的其他脚本类似。然而,这些脚本是在构建之前就运行的。下面是几种可能的用法:

  • 设置一些企业范围的配置,比如在何处查找自定义插件。

  • 设置基于当前环境的属性,比如开发人员的机器与持续集成服务器的属性。

  • 提供构建所需要的有关用户的个人信息,比如仓库或数据库身份验证凭据。

  • 定义机器的一些特定信息,比如JDK的安装位置。

  • 注册构建监听。这对一些希望能够监听Gradle事件的外部工具会很有用。

  • 注册构建logger。你可能希望自定义Gradle对生成的事件的日志打印。

init 脚本的一个主要限制是,它们不能访问buildSrc 项目里的类(该功能的详细信息可参见 第 59.3节,“的buildSrc 项目中的构建源代码”)。

60.2. 使用 init 脚本

有几种方法来使用 init 脚本︰

  • 在命令行上指定一个文件。该命令行选项是-I--init-script ,后面跟上该脚本的路径。这个命令行选项可以出现多次,每次在其后面添加另一个init 脚本.

  • 把一个init.gradle文件放到 USER_HOME/.gradle/ 目录。

  • Put a file that ends with .gradle in the USER_HOME/.gradle/init.d/ directory.

  • 把一个文件名以.gradle结尾的文件放到Gradle 分发包GRADLE_HOME/init.d/ 目录内。这能够使你可以打包一个包含某些自定义构建逻辑和插件的Gradle自定义分发包。你可以结合它与Gradle wrapper作为一种方式,以使自定义逻辑可用于你的企业中的所有构建。

如果Gradle找到了多个init脚本,那么它们将会全部按照以上的顺序执行。而给定目录的脚本,会按照字母顺序执行。这能够使得,比如,一个工具可以在命令行上指定一个init 脚本,并且用户可以放一个初始化脚本到他们的用户目录下用于定义环境,而当Gradle执行的时候,这两个脚本都会运行。

60.3. 写一个 init 脚本

与Gradle构建脚本类似,init 脚本也是一个groovy 脚本。每一个init 脚本都有一个 Gradle 实例与其关联。在这个init 脚本中调用的任何属性引用以及方法,都会委托给这个 Gradle 实例。

每一个初始化脚本也实现了 Script 接口。

60.3.1. 从一个初始化脚本中配置项目

你可以使用一个init 脚本来在构建中配置项目。这与在多项目构建中配置项目的方式类似。下面的例子展示了如何在项目被评估 之前 从一个init 脚本中执行另外的配置。该示例使用此功能来配置额外的仓库,以让它仅用于特定的环境。

示例 60.1. 使用 init 脚本在项目评估之前执行额外的配置

build.gradle

repositories {    mavenCentral()}task showRepos << {    println "All repos:"    println repositories.collect { it.name }}

init.gradle

allprojects {    repositories {        mavenLocal()    }}

gradle --init-script init.gradle -q showRepos的输出结果

> gradle --init-script init.gradle -q showReposAll repos:[MavenLocal, MavenRepo]

60.4. init 脚本的外部依赖

在 第 59.5节,“构建脚本的外部依赖” 中已经解释了,如何向一个构建脚本添加外部依赖。init 脚本同样也可以定义外部依赖。你可以通过使用<c0>initscript()</c0>方法,传入一个定义init 脚本的classpath的闭包。

示例 60.2. 声明构建脚本的外部依赖

init.gradle

initscript {    repositories {        mavenCentral()    }    dependencies {        classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'    }}

这个传给initscript() 方法的闭包配置了一个ScriptHandler 实例。你可以通过添加依赖到classpath 配置来定义init 脚本的classpath。这和你定义Java编译classpath是同样的。你可以使用在 第50.4节,“如何定义你的依赖”描述的除了项目依赖之外的任何依赖类型。

声明了init 脚本的classpath之后,你可以使用init 脚本中的类,就像classpath上的任何其他类一样。下面的示例将添加到前面的示例中,并使用init 脚本classpath中的类。

示例 60.3. 具有外部依赖的init 脚本

init.gradle

import org.apache.commons.math.fraction.Fractioninitscript {    repositories {        mavenCentral()    }    dependencies {        classpath group: 'org.apache.commons', name: 'commons-math', version: '2.0'    }}println Fraction.ONE_FIFTH.multiply(2)

Output of gradle --init-script init.gradle -q doNothing

> gradle --init-script init.gradle -q doNothing2 / 5

60.5. Init 脚本插件

与Gradle构建脚本类似,插件也可以应用在 init 脚本上。

示例 60.4. 在 init 脚本中使用插件

init.gradle

apply plugin:EnterpriseRepositoryPluginclass EnterpriseRepositoryPlugin implements Plugin<Gradle> {    private static String ENTERPRISE_REPOSITORY_URL = "http://repo.gradle.org/gradle/repo"    void apply(Gradle gradle) {        // ONLY USE ENTERPRISE REPO FOR DEPENDENCIES        gradle.allprojects{ project ->            project.repositories {                //remove all repositories not pointing to the enterprise repository url                all { ArtifactRepository repo ->                    if (!(repo instanceof MavenArtifactRepository) || repo.url.toString() != ENTERPRISE_REPOSITORY_URL) {                        project.logger.lifecycle "Repository ${repo.url} removed. Only $ENTERPRISE_REPOSITORY_URL is allowed"                        remove repo                    }                }                // add the enterprise repository                maven {                    name "STANDARD_ENTERPRISE_REPO"                    url ENTERPRISE_REPOSITORY_URL                }            }        }    }}

build.gradle

repositories{    mavenCentral()} task showRepositories << {    repositories.each{        println "repository: ${it.name} ('${it.url}')"    }}

gradle -I init.gradle showRepositories 的输出结果

> gradle -q -I init.gradle showRepositoriesrepository: STANDARD_ENTERPRISE_REPO ('http://repo.gradle.org/gradle/repo')

这个在示例的init 脚本中的插件,确保了当执行构建的时候只使用一个指定的仓库。

当把插件应用在 init 脚本中时,Gradle 会实例化该插件,并调用这个插件的实例的Plugin.apply()方法。然后 gradle 对象会被作为参数传入,用于配置构建的所有方面。当然,所应用的插件也可以作为第 60.4节,“init 脚本外部依赖”中所述的外部依赖被解析。



0 0
原创粉丝点击