- 介绍
- 介绍 - 关于这本指南
- 概述
- 概述 - 特点
- 概述 - 为什么用 Groovy?
- 教程
- 安装Gradle
- 安装Gradle - 准备阶段
- 安装Gradle - 下载与安装
- 安装Gradle - JVM选项
- 排除故障
- 构建脚本基础
- 构建脚本基础 - Projects 和 tasks
- 构建脚本基础 - Hello world
- 构建脚本基础 - 快捷的任务定义
- 构建脚本基础 - 构建脚本代码
- 构建脚本基础 - 任务依赖
- 构建脚本基础 - 动态任务
- 构建脚本基础 - 使用已经存在的任务
- 构建脚本基础 - 短标记法
- 构建脚本基础 - 自定义任务属性
- 构建脚本基础 - 调用 Ant 任务
- 构建脚本基础 - 使用方法
- 构建脚本基础 - 默认任务
- 构建脚本基础 - 通过 DAG 配置
- Java 构建入门
- Java 构建入门 - Java 插件
- Java 构建入门 - 一个基础的 Java 项目
- 一个基础的 Java 项目 - 建立项目
- 一个基础的 Java 项目 - 外部的依赖
- 一个基础的 Java 项目 - 定制项目
- 一个基础的 Java 项目 - 发布 JAR 文件
- 一个基础的 Java 项目 - 创建 Eclipse 项目
- 一个基础的 Java 项目 - 总结
- Java 构建入门 - 多项目的 Java 构建
- 多项目的 Java 构建 - 定义一个多项目构建
- 多项目的 Java 构建 - 通用配置
- 多项目的 Java 构建 - 项目之间的依赖
- 多项目的 Java 构建 - 创建一个发行版本
- 依赖管理的基础知识
- 依赖管理的基础知识 - 什么是依赖管理
- 依赖管理的基础知识 - 声明你的依赖
- 依赖管理的基础知识 - 依赖配置
- 依赖管理的基础知识 - 外部的依赖
- 依赖管理的基础知识 - 仓库
- 依赖管理的基础知识 - 发布 artifacts
- 依赖管理的基础知识 - 下一步?
- Groovy 快速入门
- Groovy 快速入门 - 一个基本的 Groovy 项目
- Groovy 快速入门 - 总结
- 网页应用快速入门
- 网页应用快速入门 - 构建一个 WAR 文件
- 网页应用快速入门 - 运行 Web 应用
- 网页应用快速入门 - 总结
- 使用 Gradle 命令行
- 使用 Gradle 命令行 - 多任务调用
- 使用 Gradle 命令行 - 排除任务
- 使用 Gradle 命令行 - 失败后继续执行构建
- 使用 Gradle 命令行 - 简化任务名
- 使用 Gradle 命令行 - 选择文件构建
- 使用 Gradle 命令行 - 获取构建信息
- 获取构建信息 - 项目列表
- 获取构建信息 - 任务列表
- 获取构建信息 - 获取任务具体信息
- 获取构建信息 - 获取依赖列表
- 获取构建信息 - 查看特定依赖
- 获取构建信息 - 获取项目属性列表
- 获取构建信息 - 构建日志
- 使用 Gradle 图形界面
- 使用 Gradle 图形界面 - 任务树
- 使用 Gradle 图形界面 - 收藏夹
- 使用 Gradle 图形界面 - 命令行
- 使用 Gradle 图形界面 - 设置
- 编写构建脚本 - Gradle 构建语言
- 编写构建脚本 - 项目 API
- 项目 API - 标准项目属性
- 编写构建脚本 - 脚本 API
- 编写构建脚本 - 声明变量
- 声明变量 - 局部变量
- 声明变量 - 扩展属性
- 编写构建脚本 - Groovy 基础
- Groovy 基础 - Groovy JDK
- Groovy 基础 - 属性存取器
- Groovy 基础 - 可有可无的圆括号
- Groovy 基础 - List 和 Map 集合
- Groovy 基础 - 闭合作为方法的最后一个参数
- Groovy 基础 - 闭合委托对象
- 深入了解 Tasks
- 深入了解 Tasks - 定义 tasks
- 深入了解 Tasks - 定位 tasks
- 深入了解 Tasks - 配置 tasks
- 深入了解 Tasks - 给 task 加入依赖
- 深入了解 Tasks - 给 tasks 排序
- 深入了解 Tasks - 给 task 加入描述
- 深入了解 Tasks - 替换 tasks
- 深入了解 Tasks - 跳过 tasks
- 深入了解 Tasks - 跳过 up-to-date 的任务
- 深入了解 Tasks - Task 规则
- 深入了解 Tasks - 终止 tasks
- 深入了解 Tasks - 补充
- 补充 - Gradle 属性 和 system 属性
- 补充 - 使用其他的脚本配置项目
- 补充 - 使用其他的脚本配置任意对象
- 补充 - 配置任意对象
- 补充 - 缓存
- 文件操作
- 文件操作 - 定位文件
- 文件操作 - 文件集合
- 文件操作 - 文件树
- 文件操作 - 使用一个归档文件的内容作为文件树
- 文件操作 - 指定一组输入文件
- 文件操作 - 复制文件
- 文件操作 - 使用同步任务
- 文件操作 - 创建归档文件
- 使用 Ant 插件
- 使用 Ant 插件 - 使用 Ant 任务和 Ant 类型的构建
- 使用 Ant 任务和 Ant 类型的构建 - 在构建中使用自定义 Ant 任务
- 使用 Ant 插件 - 导入一个 Ant 构建
- 使用 Ant 插件 - Ant 的属性与引用
- 使用 Ant 插件 - API
- Logging
- Logging - 选择日志等级
- Logging - 编写自己的日志信息
- Logging - 外部工具和库的log
- Logging - 改变 Gradle 记录的内容
- Gradle的守护进程
- Gradle的守护进程 - 什么是Gradle的守护进程
- Gradle的守护进程 - 管理和配置
- 管理和配置 - 如何启用的摇篮守护进程
- 管理和配置 - 如何禁用Gradle的守护进程
- 管理和配置 - 怎样抑制“please consider using the Gradle Daemon”消息
- 管理和配置 - 为什么会在机器上出现不只一个守护进程
- 管理和配置 - 守护进程占用多大内存并且能不能给它更大的内存?
- 管理和配置 - 如何停止守护进程
- 管理和配置 - 守护进程何时会出错
- Gradle的守护进程 - 什么时候使用Gradle守护进程
- Gradle的守护进程 - 工具和集成开发环境
- Gradle的守护进程 - 摇篮守护进程如何使构建速度更快
- 摇篮守护进程如何使构建速度更快 - 未来可能的改进
- Gradle Plugins
- Gradle Plugins - 插件的作用
- Gradle Plugins - 插件的类型
- Gradle Plugins - 应用插件
- 应用插件 - 脚本插件
- 应用插件 - 二进制插件
- 二进制插件 - 二进制插件的位置
- Gradle Plugins - 使用构建脚本块应用插件
- Gradle Plugins - 使用插件的插件DSL
- 使用插件的插件DSL - 插件DSL的限制
- 使用插件的插件DSL - 约束语法
- 使用插件的插件DSL - 只能在构建脚本中使用
- 使用插件的插件DSL - 不能与subjects{},allprojects{}等结合使用
- Gradle Plugins - 查找社区插件
- Gradle Plugins - 更多关于插件
- Gradle插件规范
- Gradle插件规范 - 语言插件
- Gradle插件规范 - 孵化中的语言插件
- Gradle插件规范 - 集成插件
- Gradle插件规范 - 孵化中的集成插件
- Gradle插件规范 - 软件开发插件
- Gradle插件规范 - 孵化中的软件开发插件
- Gradle插件规范 - 基础插件
- Gradle插件规范 - 第三方插件
- Java 插件
- Java 插件 - 使用
- Java 插件 - 资源集
- Java 插件 - 任务
- Java 插件 - 项目布局
- Java 插件 - 依赖管理
- Java 插件 - 公共配置
- Java 插件 - 使用资源集工作
- 使用资源集工作 - 资源集属性
- 使用资源集工作 - 定义新的资源集
- 使用资源集工作 - 资源集例子
- Java 插件 - Javadoc
- Java 插件 - 清除
- Java 插件 - 资源
- Java 插件 - 编译 Java
- Java 插件 - 增量 Java 编译
- Java 插件 - 测试
- 测试 - 测试执行
- 测试 - 测试调试
- 测试 - 测试过滤
- 测试 - 通过系统属性执行单独测试
- 测试 - 测试检测
- 测试 - 测试分组
- 测试 - 测试报告
- 测试报告 - TestNG 的参数化方法和报告
- 测试 - 公共值
- Java 插件 - Jar
- Jar - Manifest
- Java 插件 - 上传
- War插件
- War插件 - 使用
- War插件 - 任务
- War插件 - 项目布局
- War插件 - 依赖管理
- War插件 - 公共配置
- War插件 - War
- War插件 - 定制War
- Ear插件
文件操作 - 复制文件
你可以使用复制任务( Copy
)去复制文件. 复制任务扩展性很强,能够过滤复制文件的内容, 映射文件名.
使用复制任务时需要提供想要复制的源文件和一个目标目录,如果你要指定文件被复制时的转换方式,可以使用 复制规则. 复制规则被 CopySpec
接口抽象,复制任务实现了这个接口. 使用 CopySpec.from()
方法指定源文件.使用 CopySpec.into()
方法指定目标目录.
例 15.10. 使用复制任务复制文件
build.gradle
task copyTask(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
}
from()
方法接收任何 files()
方法支持的参数. 当参数被解析为一个目录时,在这个目录下的任何文件都会被递归地复制到目标目录(但不是目录本身).当一个参数解析为一个文件时,该文件被复制到目标目录中.当参数被解析为一个不存在的文件时,这个参数就会忽略.如果这个参数是一个任务,任务的输出文件(这个任务创建的文件)会被复制,然后这个任务会被自动添加为复制任务的依赖.
例 15.11 指定复制任务的源文件和目标目录
build.gradle
task anotherCopyTask(type: Copy) {
// 复制 src/main/webapp 目录下的所有文件
from 'src/main/webapp'
// 复制一个单独文件
from 'src/staging/index.html'
// 复制一个任务输出的文件
from copyTask
// 显式使用任务的 outputs 属性复制任务的输出文件
from copyTaskWithPatterns.outputs
// 复制一个 ZIP 压缩文件的内容
from zipTree('src/main/assets.zip')
// 最后指定目标目录
into { getDestDir() }
}
你可以使用Ant-style
规则或者一个闭合选择要复制的文件.
例 15.12 选择要复制文件
build.gradle
task copyTaskWithPatterns(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
include '**/*.html'
include '**/*.jsp'
exclude { details -> details.file.name.endsWith('.html') &&
details.file.text.contains('staging') }
}
你也可以使用 Project.copy()
方法复制文件,它的工作方式有一些限制,首先该方法不是增量的,请参考 第 14.9节 跳过最新的任务.第二,当一个任务被用作复制源时(例如 from() 方法的参数), copy()
方法不能够实现任务依赖,因为它是一个普通的方法不是一个任务.因此,如果你使用 copy()
方法作为一个任务的一部分功能,你需要显式的声明所有的输入和输出以确保获得正确的结果.
例 15.13 不使用最新检查方式下用 copy() 方法复制文件
build.gradle
task copyMethod << {
copy {
from 'src/main/webapp'
into 'build/explodedWar'
include '**/*.html'
include '**/*.jsp'
}
}
例 15.14 使用最新的检查方式下用 copy() 方法复制文件
build.gradle
task copyMethodWithExplicitDependencies{
// 对输入做最新检查,添加 copyTask 作为依赖
inputs.file copyTask
outputs.dir 'some-dir' //对输出做最新检查
doLast{
copy {
// 复制 copyTask 的输出
from copyTask
into 'some-dir'
}
}
}
建议尽可能的使用复制任务,因为它支持增量化的构建和任务依赖推理,而不需要去额外的费力处理这些.不过 copy()
方法可以用作复制任务实现的一部分.即该 方法被在自定义复制任务中使用,请参考 第60章 编写自定义任务.在这样的场景下,自定义任务应该充分声明与复制操作相关的输入/输出。
15.6.1 重命名文件
例 15.15 在复制时重命名文件
build.gradle
task rename(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
// 使用一个闭合映射文件名
rename { String fileName ->
fileName.replace('-staging-', '')
}
// 使用正则表达式映射文件名
rename '(.+)-staging-(.+)', '$1$2'
rename(/(.+)-staging-(.+)/, '$1$2')
}
15.6.2 过滤文件
例 15.16 在复制时过滤文件
build.gradle
import org.apache.tools.ant.filters.FixCrLfFilter
import org.apache.tools.ant.filters.ReplaceTokens
task filter(type: Copy) {
from 'src/main/webapp'
into 'build/explodedWar'
// 在文件中替代属性标记
expand(copyright: '2009', version: '2.3.1')
expand(project.properties)
// 使用 Ant 提供的过滤器
filter(FixCrLfFilter)
filter(ReplaceTokens, tokens: [copyright: '2009', version: '2.3.1'])
// 用一个闭合来过滤每一行
filter { String line ->
"[$line]"
}
// 使用闭合来删除行
filter { String line ->
line.startsWith('-') ? null : line
}
}
在源文件中扩展和过滤操作都会查找的某个标志 token
,如果它的名字是 tokenName
, 它的格式应该类似于 @tokenName@
.
15.6.3 使用 CopySpec 类
复制规范来自于层次结构,一个复制规范继承其目标路径,包括模式,排除模式,复制操作,名称映射和过滤器.
例 15.17. 嵌套复制规范
build.gradle
task nestedSpecs(type: Copy) {
into 'build/explodedWar'
exclude '**/*staging*'
from('src/dist') {
include '**/*.html'
}
into('libs') {
from configurations.runtime
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论