Gradle中的文件操作方式有五种:本地文件、文件集合、文件树、文件拷贝和归档文件。
本地文件
比较简单,API跟java中的完全一致:
task("test_file") {
doFirst {
def f1 = file("../test.txt")
if (!f1.exists()) {
f1.createNewFile()
}
def f2 = file("D:/develop/ideaWorkspace/GradleTest/test2.txt")
if (!f2.exists()) {
f2.createNewFile()
}
def f3 = new File("src")
println f3.absolutePath
}
}
文件集合
Gradle中的文件集合用file()
创建,既可以遍历,也支持+
、-
、+=
、-=
运算符,也可以转换成Set
、List
等集合:
task("test_file_collections") {
doFirst {
def file_cols = files( // 创建文件集合
"../test1.txt",
file("../test2.txt"),
new File("../test3.txt"),
["../test4.txt", "../test5.txt"])
file_cols.forEach({ // 遍历文件集合
File file -> {
if (!file.exists()) {
file.createNewFile()
}
println file.absolutePath
}
})
// 将文件集合转换成Set或List,并且遍历
Set s1 = file_cols.files
Set s2 = file_cols as Set
List list = file_cols as List
list.forEach({
println it.name
})
// 文件集合的操作符操作
file_cols += file("../test6.txt")
file_cols -= file("../test1.txt")
println "========================================"
file_cols.forEach({
if (it != null) {
println it.absolutePath
}
})
}
}
输出结果:
(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_collections
> Task :lib1:test_file_collections
D:\develop\ideaWorkspace\GradleTest\test1.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
test1.txt
test2.txt
test3.txt
test4.txt
test5.txt
========================================
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test4.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
D:\develop\ideaWorkspace\GradleTest\test6.txt
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
相关文件均可以被创建出来:
文件树
文件树继承自文件集合,通过fileTree()
创建,用来遍历某目录下的所有文件(包括子目录及子目录中的文件),并且可以指定包含和过滤方法:
task "test_file_tree" {
doFirst {
def tree = fileTree("../").include("**/*.txt") // 方式1,使用路径创建文件树,通过include()/exclude()等方法设置过滤原则
def tree2 = fileTree("../") { // 方式2,使用路径+闭包的形式创建文件树,过滤原则写在闭包中
include "**/*.txt"
}
def tree3 = fileTree( // 方式3,使用参数映射的方式创建文件树
dir: "../",
includes: ["**/*.txt"], excludes: ["**/*1*", "**/*4*"])
tree3.each({ // 遍历文件树中的文件
File f -> {
println f.absolutePath
}
})
}
}
输出效果如下:
(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle test_file_tree
> Task :lib1:test_file_tree
D:\develop\ideaWorkspace\GradleTest\test.txt
D:\develop\ideaWorkspace\GradleTest\test2.txt
D:\develop\ideaWorkspace\GradleTest\test3.txt
D:\develop\ideaWorkspace\GradleTest\test5.txt
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
文件拷贝
通过类型为Copy
的函数实现:
task "CopyTask" (type: Copy) {
from ("../src", "../test1.txt", zipTree("../test.zip"))
into "../src_copied" // 目的目录不存在时,会自动创建
}
若from
参数为一个目录,则将目录下的所有内容(不包括目录本身)复制到目的目录;若from
参数为一个文件,则复制文件本身;若from
参数为一个zipTree
压缩包,则将压缩包的内容复制到目的目录。任何需要复制的内容,如果在目的目录已经存在,则不会再一次复制。
我们也可以通过include
、exclude
、rename
等函数或闭包,实现复制文件的包含、排除和复制后的重命名:
task "CopyTask" (type: Copy) {
from ("../src", "../test1.txt", zipTree("../test.zip"))
into "../src_copied"
// 包含
include "**/*.txt"
// 排除
exclude {
it.file.name.contains("3") || !it.file.name.endsWith(".txt")
}
// 复制后的重命名
rename {String filename -> {
filename.replace(".txt", ".txt.bak")
}}
}
执行任务后的效果:
我们也可以在普通任务中使用copy
闭包执行复制任务:
task "copy_2" {
doFirst {
copy {
from ("../src", "../test1.txt", zipTree("../test.zip"))
into "../src_copied"
include "**/*.txt"
exclude {
it.file.name.contains("3") || !it.file.name.endsWith(".txt")
}
rename {String filename -> {
filename.replace(".txt", ".txt.bak")
}}
}
}
}
或者直接通过copy
闭包执行复制任务:
task "copy_2" {
doFirst {
copy {
from ("../src", "../test1.txt", zipTree("../test.zip"))
into "../src_copied"
include "**/*.txt"
exclude {
it.file.name.contains("3") || !it.file.name.endsWith(".txt")
}
rename {String filename -> {
filename.replace(".txt", ".txt.bak")
}}
}
}
}
而后,执行该项目的gradle build
即可:
归档文件
以打zip包为例,gradle压缩文件是通过Zip
闭包任务函数实现的:
task myZip (type: Zip) {
from "../build" // 压缩的源目录
destinationDir(file("../")) // 压缩完成后,压缩文件的保存目录
baseName "build_s" // 压缩完成后,压缩文件名
}
println myZip.archiveName // 输出压缩文件名
输出效果如下:
(base) PS D:\develop\ideaWorkspace\GradleTest\lib1> gradle myZip
> Configure project :lib1
build_s.zip
Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.
You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own script
s or plugins.
See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings
BUILD SUCCESSFUL in 2s
1 actionable task: 1 executed
同时可以在指定位置找到输出文件: