Gradle-user guide-第6章 构建脚本基础(译) --续

本文介绍Gradle构建脚本的高级特性,包括动态任务创建、任务属性扩展、使用Ant任务、定义默认任务等内容,并展示了如何组织构建逻辑。
第6章 构建脚本基础(6.6-6.14)
6.6动态任务
Groovy不仅仅能够定义一个任务做什么,例如,它也能够动态的创建任务。
例子6.8任务的动态定义

build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
使用gradle -q task1 ,输出如下:
> gradle -q task1
I'm task number 1
 
6.7操作存在的任务
一旦任务被创建,它就可以通过api来访问,这是与Ant不同的,如,创建额外的依赖。
例子6.9通过API访问任务--增加依赖

build.gradle

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
task0.dependsOn task2, task3

> gradle -q task0
I'm task number 2
I'm task number 3
I'm task number 0  
或者你可以为一个现存的任务添加行为
例子6.10通过API访问任务--增加行为

build.gradle

task hello << {
    println 'Hello Earth'
}
hello.doFirst {
    println 'Hello Venus'
}
hello.doLast {
    println 'Hello Mars'
}
hello << {
    println 'Hello Jupiter'
}

> gradle -q hello
Hello Venus
Hello Earth
Hello Mars
Hello Jupiter
doFirst  doLast 可以被多次执行。它们在任务动作列表的开始和结束加入动作。当任务执行的时候, 在动作列表里的动作将被按顺序执行。 << 操作符仅仅是 doLast 的一个别名。

6.8快捷标记

正如你已经注意到了,在之前的例子中,有一个快捷标记来访问存在的任务,每一个任务都可以作为构建脚本的属性。

例子6.11将任务作为构建脚本的属性来访问

build.gradle

task hello << {
    println 'Hello world!'
}
hello.doLast {
    println "Greetings from the $hello.name task."
}

> gradle -q hello
Hello world!
Greetings from the hello task.
这使代码很有可读性,特别是当使用了由插件(如编译)提供的任务时。
6.9附加任务属性
可以在给任务添加自定义属性,如添加一个叫myProperty的属性,然后给这个属性设置一个初始值,从这一点来看,该属性可以被读取和设置,就像一个预定义的属性一样。
例子6.12给任务添加附加属性

build.gradle

task myTask {
    ext.myProperty = "myValue"
}
task printTaskProperties << {
    println myTask.myProperty
}

> gradle -q printTaskProperties
myValue
附加属性不只是限于任务,在13.4.2中将会了解到更多相关的内容。
6.10使用Ant任务
Ant任务是Gradle的一等公民。Gradle 通过 GroovyAnt 任务提供了出色的集成。Groovy有很好的AntBuilder,在Gradle使用 Ant任务和在build.xml中使用一样的便利,甚至是更加强大。下面的例子,你可以学习如何去执行ant任务,以及如何访问ant属性。
例子6.13使用AntBuilder执行ant.loadfile目标

build.gradle

task loadfile << {
    def files = file('../antLoadfileResources').listFiles().sort()
    files.each {File file ->
        if(file.isFile()){
            ant.loadfile(srcFile:file,property:file.name)
            println "*** $file.name ***"
            println "${ant.properties[file.name]}"
        }

    }
}

> gradle -q loadfile
*** agile.manifesto.txt ***
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration  over contract negotiation
Responding to change over following a plan
 *** gradle.manifesto.txt ***
Make the impossible possible, make the possible easy and make the easy elegant.
(inspired by Moshe Feldenkrais)
build脚本中你可以用Ant脚本做很多事情。你将会在第17章中学习到更多相关内容。
6.11使用方法
Gradle可以衡量你组织构建逻辑的能力,第一个级别就是使用方法。

例子6.14使用方法来组织你的构建逻辑

build.gradle

task checksum <<{
    fileList('../').each {File file ->
        ant.checksum(file:file,property:"cs_$file.name")
        println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
    }
}
task loadfile <<{
    fileList("./").each {File file ->
        ant.loadfile(srcFile:file,property:file.name)
        println "i'm fond of $file.name"
    }
}

File[] fileList(String dir){
    file(dir).listFiles({file->file.isFile()} as FileFilter).sort()
}
> gradle -q loadfile

I'm fond of agile.manifesto.txt

I'm fond of gradle.manifesto.txt

之后你将会看到,上面定义的那种方法能在多项目构建中被子项目共享,如果你的构建逻辑变得更加复杂,Gradle为你提供了非常便利的方式去组织你的构建逻辑。我们会用一整个章节去阐述组织构建逻辑这一主题。参考59章节。

612默认任务

Gradle允许为你的构建定义一个或多个默认任务。

例子6.15定义默认任务

build.gradle

defaultTasks 'clean' ,'run'
task clean <<{
    println "default cleaning"
}
task run <<{
    println "default running"
}
task other<<{
    println "other"
}

> gradle -q

Default Cleaning!

Default Running!

上面的命令相当于“gradleclean run”,在多项目构建中,每个子项目可以有自己特有的默认任务,如果一个子项目没有指定其默认任务,它会使用其父项目的默认任务作为自己的默认任务。

613DAG配置

我们之后会详细描述(参考55章,构建的生命周期),gradle有配置阶段和执行阶段。在配置阶段之后,Gradle知道了应该被执行的所有任务,gradle提供了一个钩子(hook去利用这些信息。一个用法就是,检查发布的任务时候在将要执行的任务之中,然后据此给某些变量赋不同的值。

在接下来的例子中,“distribution ”“release”任务的执行会导致变量version具有不同的值。

例子6.16不同的结果取决于选择的任务

build.gradle

task distribution <<{
    println "we build the zip with version=$version"
}
task release(dependsOn:'distribution')<<{
    println 'we release now'
}
gradle.taskGraph.whenReady {taskGraph ->
    if(taskGraph.hasTask(release)){
        version = '1.0'
    }else{
        version='1.0-SNAPSHOT'
    }
}

> gradle -q distribution

We build the zip with version=1.0-SNAPSHOT

> gradle -q release

We build the zip with version=1.0

We release now

重要的是,whenReadyrelease任务执行之前就已经影响了release任务,即使release不是首要任务。(首要任务指传递给gradle命令的任务)

614下一步去哪里

在这整个第六章节里,我们对任务进行了初探,这并不是任务的全部,如果你想要跳到更多的细节,请参见第15章节。

<think>首先,用户的问题是:"我想查询build.gradle中使用的Gradle版本号请问gradle-8.11.1-bin.zip对应的build.gradle版本号是多少"。用户想知道Gradle发行包名称gradle-8.11.1-bin.zip对应的build.gradle文件中应该指定的版本号。回顾系统级指令:-所有行内数学表达式必须使用$...$格式。-独立公式使用$$...$$格式并单独成段。-LaTeX语法正确。-使用中文回答。-生成相关问题。-回答中引用的段落末尾自然地添加引用标识,例如[^1]。-回答结构清晰,帮助用户逐步解决问题,保证真实可靠。用户的问题是关于Gradle版本号的。从引用中,我可以提取相关信息:-引用[1]提到:"版本号替换为实际需要的Gradle版本号,比如gradle-8.1.1-bin.zip。"这表明Gradle发行包的名称直接对应于版本号。-引用[2]解释了gradle-wrapper.properties文件如何指定Gradle版本:"上面的文件gradle-wrapper.properties,当别人通过git获取到项目代码时,也会根据这个文件自动下载配置gradle"。所以,build.gradle本身不直接指定版本号,而是通过wrapper。在Gradle项目中,Gradle版本通常在gradle-wrapper.properties文件中指定,而不是在build.gradle文件中。build.gradle文件包含构建脚本,而wrapper文件指定使用的Gradle版本。用户提到的"build.gradle中使用的Gradle版本号"可能是个误解。实际上,版本号在gradle-wrapper.properties中定义。例如:-gradle-wrapper.properties中,有类似distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip的行。所以,对于gradle-8.11.1-bin.zip,对应的版本号是8.11.1。现在,回答用户的问题:-gradle-8.11.1-bin.zip对应的版本号是8.11.1。-在build.gradle中,通常不指定Gradle版本号;它由wrapper管理。我需要结构清晰地回答:1.澄清误解:build.gradle文件本身不包含Gradle版本号;版本号在gradle-wrapper.properties中指定。2.解释版本号:gradle-8.11.1-bin.zip中的"8.11.1"就是版本号。3.提供相关引用:自然地添加引用标识。最后,生成相关问题。回答结构:-先解释核心问题。-然后提供详细步骤或说明。-添加引用。-结尾生成相关问题。确保使用中文。最终回答:-版本号是8.11.1。-gradle-wrapper.properties中,distributionUrl会指定这个版本。相关问题:1.如何配置GradleWrapper来使用特定版本?2.在build.gradle中如何指定插件版本?3.Gradle版本号的含义是什么?引用:-引用[2]提到wrapper配置,所以可以引用它。</think>### Gradle版本号查询说明 针对您的查询:“我想查询build.gradle中使用的Gradle版本号,请问gradle-8.11.1-bin.zip对应的build.gradle版本号是多少”,我将逐步解释相关概念,确保回答准确可靠。 #### 核心问题解答 在Gradle项目中,**build.gradle文件本身不直接指定Gradle版本号**。相反,Gradle版本号由`gradle-wrapper.properties`文件管理,该文件定义了使用的Gradle发行包。对于您提到的发行包名称`gradle-8.11.1-bin.zip`: - **对应的版本号是`8.11.1`**。 - 这个版本号直接从文件名解析:`gradle-<version>-bin.zip`格式中,`<version>`部分即版本号,例如`8.11.1`表示主版本8、次版本11、修订版本1。 在`gradle-wrapper.properties`文件中,您会看到类似的行: ```properties distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip ``` 这行代码指定了下载和使用的Gradle版本为`8.11.1`[^2]。 #### 为什么build.gradle不包含版本号? - `build.gradle`文件主要用于定义构建脚本(如依赖项、插件和任务),而Gradle运行时的版本由Wrapper机制隔离管理。这确保了项目在不同环境中使用一致的Gradle版本,避免与本地安装冲突[^2]。 - 如果您在项目中配置了Gradle Wrapper(通过`gradlew`脚本),则无需在`build.gradle`中硬编码版本号。Wrapper会根据`gradle-wrapper.properties`自动下载指定版本的Gradle。 #### 如何检查和修改版本号 1. **查看当前版本**: - 打开项目中的`gradle-wrapper.properties`文件。 - 查找`distributionUrl`行,例如`distributionUrl=.../gradle-8.11.1-bin.zip`,版本号即`8.11.1`。 2. **修改版本号**: - 直接编辑`distributionUrl`中的版本部分,例如改为`gradle-7.6-bin.zip`以切换到7.6版本。 - 运行`./gradlew wrapper --gradle-version 8.11.1`命令可自动更新Wrapper配置[^2]。 #### 注意事项 - 确保下载地址可靠:建议使用官方或镜像站点(如腾讯镜像或阿里云镜像)以避免安全问题[^1]。 - 版本兼容性:Gradle插件(在`build.gradle`中通过`plugins`块指定)可能需要与Gradle版本匹配。例如: ```gradle plugins { id 'java' version '8.3' // 插件版本需适配Gradle 8.11.1 } ``` 您可以在[Gradle官方兼容性指南](https://docs.gradle.org/current/userguide/compatibility.html)中验证。 总之,`gradle-8.11.1-bin.zip`对应的Gradle版本号是**$8.11.1$**,实际配置需通过`gradle-wrapper.properties`管理[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值