• Gradle 1.12 翻译——第十三章 编写构建脚本


    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html

    本文原创。转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/40976325

    关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。如有发现翻译有误的地方,将首先在以上两个地方更新。

    因时间精力问题。博客中发表的译文基本不会同步改动。


    第十三章 编写构建脚本

    这一章着眼于一些编写构建脚本的具体信息。

    13.1. Gradle 构建语言

    Gradle 提供一种领域特定语言或者说是 DSL。来描写叙述构建。这样的构建语言基于 Groovy 中。并进行了一些补充。使其易于描写叙述构建。

    13.2. Project API

    第 7 章。 Java 高速入门的教程中,我们使用了 apply ()方法。

    这方法从何而来?我们之前说在 Gradle 中构建脚本定义了一个项目(project)。在构建的每个项目中,Gradle 创建了一个Project类型的实例,并在构建脚本中关联此Project对象。

    当构建脚本运行时,它会配置此Project对象:

    获取有关编写构建脚本帮助

    不要忘记您的构建脚本是简单的 Groovy 代码,并驱动着 Gradle API。而且Project接口是您在 Gradle API 中訪问一切 的入点。所以。假设你想知道什么 '标签(tag)' 在构建脚本中可用,您能够去看项目接口的文档。

    • 在构建脚本中,你所调用的不论什么一个方法,假设在构建脚本中没有定义,它将被托付给Project对象。

    • 在构建脚本中。你所訪问的不论什么一个属性。假设在构建脚本里没有定义。它也会被托付给Project对象。

    以下我们来试试这个。试试訪问Project对象的name属性。

    Example 13.1. 訪问 Project 对象的属性

    build.gradle

    println name
    println project.name

    gradle -q check的输出结果

    > gradle -q check
    projectApi
    projectApi

    这两个println语句打印出同样的属性。

    在生成脚本中没有定义的属性,第一次使用时自己主动托付到Project对象。其它语句使用了在不论什么构建脚本中能够訪问的project属性,则返回关联的Project对象。仅仅有当您定义的属性或方法Project对象的一个成员同样名字时,你才须要使用project属性。

    13.2.1. 标准project属性

    Project对象提供了一些在构建脚本中可用的标准的属性。

    下表列出了经常使用的几个属性。

    表 13.1. Project属性

    名称 类型 默认值
    project Project Project实例
    name String 项目文件夹的名称。

    path String 项目的绝对路径。

    description String 项目的描写叙述。
    projectDir File 包括生成脚本的文件夹。
    buildDir File projectDir/build
    group Object 未指定
    version Object 未指定
    ant AntBuilder AntBuilder实例

    13.3.  Script API

    当 Gradle 运行一个脚本时,它将脚本编译为一个实现了Script接口的类。这意味着全部由该Script接口声明的属性和方法在您的脚本中是可用的。

    13.4. 声明变量

    有两类能够在生成脚本中声明的变量: 局部变量和额外属性。

    13.4.1. 局部变量局部

    局部变量是用defkeyword声明的。

    它们仅仅在定义它们的范围内能够被訪问。局部变量是Groovy 语言底层的一个特征。

    演示样例 13.2. 使用局部变量

    build.gradle

    def dest = "dest"
    
    task copy(type: Copy) {
        from "source"
        into dest
    }

    13.4.2. 额外属性

    Gradle 的域模型中,全部增强的对象都能够容纳用户定义的额外的属性。这包含但并不限于项目(project)、任务(task)和源代码集(source set)。

    额外的属性能够通过所属对象的ext属性进行加入,读取和设置。或者,能够使用ext块同一时候加入多个属性。

    13.3 样例. 使用额外属性

    build.gradle

    apply plugin: "java"
    
    ext {
        springVersion = "3.1.0.RELEASE"
        emailNotification = "build@master.org"
    }
    
    sourceSets.all { ext.purpose = null }
    
    sourceSets {
        main {
            purpose = "production"
        }
        test {
            purpose = "test"
        }
        plugin {
            purpose = "production"
        }
    }
    
    task printProperties << {
        println springVersion
        println emailNotification
        sourceSets.matching { it.purpose == "production" }.each { println it.name }
    }

    gradle -q printProperties的输出结果

    > gradle -q printProperties
    3.1.0.RELEASE
    build@master.org
    main
    plugin

    在此演示样例中。 一个ext代码块将两个额外属性加入到project对象中。此外,通过将ext.purpose设置为nullnull是一个同意的值)。一个名为purpose的属性被加入到每一个源代码集(source set)。

    一旦属性被加入,他们就能够像预定的属性一样被读取和设置。

    通过加入属性所要求特殊的语法,Gradle 能够在你试图设置 (提前定义的或额外的) 的属性,但该属性拼写错误或不存在时 fail fast。[5]额外属性在不论什么能够訪问它们所属的对象的地方都能够被訪问。这使它们有着比局部变量更广泛的作用域。

    父项目上的额外属性。在子项目中也能够訪问。

    有关额外属性和它们的 API 的具体信息,请參阅ExtraPropertiesExtension

    13.5.一些 Groovy 的基础知识

    Groovy 提供了用于创建 DSL 的大量特点,而且 Gradle 构建语言利用了这些特点。了解构建语言是怎样工作的,将有助于你编写构建脚本,特别是当你開始写自己定义插件和任务的时候。

    13.5.1. Groovy JDK

    Groovy 对 JVM 的类添加了非常多实用的方法。比如, iterable 新增的each方法,会对iterable 的元素进行遍历:

    演示样例 13.4. Groovy JDK 的方法

    build.gradle

    // Iterable gets an each() method
    configurations.runtime.each { File f -> println f }

    能够看看http://groovy.codehaus.org/groovy-jdk/,了解很多其它具体信息。

    13.5.2. 属性訪问器

    Groovy 会自己主动地把一个属性的引用转换为对适当的 getter 或 setter 方法的调用。

    样例 13.5. 属性訪问器

    build.gradle

    // Using a getter method
    println project.buildDir
    println getProject().getBuildDir()
    
    // Using a setter method
    project.buildDir = 'target'
    getProject().setBuildDir('target')

    13.5.3 括号可选的方法调用

    调用方法时括号是可选的。

    演示样例 13.6. 不带括号的方法调用

    build.gradle

    test.systemProperty 'some.prop', 'value'
    test.systemProperty('some.prop', 'value')

    13.5.4. List 和 Map

    Groovy 提供了一些定义ListMap实例的快捷写法。

    Example 13.7. List and map

    build.gradle

    // List literal
    test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
    
    List<String> list = new ArrayList<String>()
    list.add('org/gradle/api/**')
    list.add('org/gradle/internal/**')
    test.includes = list
    
    // Map literal
    apply plugin: 'java'
    
    Map<String, String> map = new HashMap<String, String>()
    map.put('plugin', 'java')
    apply(map)

    13.5.5.作为方法最后一个參数的闭包

    Gradle DSL 在非常多地方使用闭包。你能够在这里查看很多其它有关闭包的资料。

    当方法的最后一个參数是一个闭包时。你能够把闭包放在方法调用之后:

    Example 13.8. 作为方法參数的闭包

    build.gradle

    repositories {
        println "in a closure"
    }
    repositories() { println "in a closure" }
    repositories({ println "in a closure" })

    13.5.6. 闭包托付(delegate)

    每一个闭包都有一个托付对象。Groovy 使用它来查找变量和方法的引用。而不是作为闭包的局部变量或參数。

    Gradle 在配置闭包中使用到它,把托付对象设置为被配置的对象。

    Example 13.9. 闭包托付

    build.gradle

    dependencies {
        assert delegate == project.dependencies
        compile('junit:junit:4.11')
        delegate.compile('junit:junit:4.11')
    }


    [5截至 Gradle 1.0-milestone-9版本号,我们鼓舞但不强制要求使用 ext 来加入额外属性因此,当未知的属性被设置时,Gradle不会构建失败。然而。它将打印一个警告。


  • 相关阅读:
    解决JAVA调用C++ DLL文件Unable to load library的问题
    java调用C或者C++动态库dll
    C# 实现 ICMP PING 功能
    利用Ngnix代理基于Baget搭建私有Nuget服务
    自动驾驶常见术语的缩写和释义 微信公众号
    单细胞公共数据挖掘
    TCP标志信息
    [Javascript] Extending debounce with a maxWait Option
    [Javascript] Build lodash.merge from Scratch
    [Typescript] When to use generic type?
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5286857.html
Copyright © 2020-2023  润新知