gradle重要的两个概念(Gradle学习记录005用Gradle操作文件)

https://docs.gradle.org/current/userguide/working_with_files.html几乎所有的Gradle构建都与文件相关比如使用源代码文件,依赖文件,生成报表等所以Gradle提供了一整套API来使操作文件变的更加简单操作文件的API包括两部分:,我来为大家科普一下关于gradle重要的两个概念?以下内容希望对你有帮助!

gradle重要的两个概念(Gradle学习记录005用Gradle操作文件)

gradle重要的两个概念

学习如何使用Gradle操作文件,第一部分。该学习记录基于Gradle官方网站资料。本篇参考链接如下:

https://docs.gradle.org/current/userguide/working_with_files.html

几乎所有的Gradle构建都与文件相关。比如使用源代码文件,依赖文件,生成报表等。所以Gradle提供了一整套API来使操作文件变的更加简单。操作文件的API包括两部分:

  • 确定需要被操作的文件的或者路径的位置
  • 确定将要对这些文件或路径执行什么操作
1.拷贝单个文件

可以通过构建一个类型为Copy的任务来完成拷贝文件。配置这个Copy任务所需要的属性,比如源文件,目标目录等。

task copyfile(type: Copy) { // 指定要拷贝的源文件 from file("$buildDir/sourceFiles/file1.txt") // 指定拷贝目的文件夹 into file("$buildDir/destination") //以下代码省略了file()方法,执行结果相同 //from "$buildDir/sourceFiles/file1.txt" //into "$buildDir/destination" }

输出:

$ gradle copyFile

BUILD SUCCESSFUL in 0s

1 actionable task: 1 up-to-date

工程根目录下\build\sourceFiles文件夹的file1.txt被拷贝到了\build\destination文件夹下

例子中的路径是直接以字符串的形式写在脚本中,属于hard coding。并不利于维护。Gradle支持使用其他任务的属性,或者其他脚本定义的变量。比如:

// 假定有myReportTaskhe和archiveReportsTask两个任务 // 它们分别有outputFile和dirToArchive属性 task copyReport3(type: Copy) { from myReportTask.outputFile into archiveReportsTask.dirToArchive }

※这段脚本无法执行,因为需要构建另外两个任务并设置属性。后续会大量用到这种方式,所以暂时不提供可执行的例子。

2.拷贝多个文件
  • 显式指定每个需要拷贝的文件

task copyFile(type: Copy) { from $buildDir/sourceFiles/file1.txt $buildDir/sourceFiles/file2.txt into $buildDir/destination }

输出

$ gradle copyFile

BUILD SUCCESSFUL in 0s

1 actionable task: 1 up-to-date

两个文件被拷贝到了/build/destination文件夹。

  • 拷贝整个文件夹的文件,可通过扩展名指定拷贝文件的种类

task copyFiles(type: Copy) { from "$buildDir/sourceFiles" // 过滤.txt文件 include "*.txt" // 过滤子文件夹中的.txt文件 // include "**./*.txt" into "$buildDir/destination" }

使用include "**./*.txt",会把文件路径也一并拷贝。如果不需要文件路径,需要使用File Collection。

// 建立了一个File Collection从File Tree制定的文件夹中抽取所有的txt文件 // 子文件夹的txt文件也是抽出对象 FileCollection textFiles = fileTree("$buildDir/sourceFiles").filter { File f -> f.name.endsWith(".txt") } task copyFiles(type: Copy) { from (textFiles) into "$buildDir/destination" }

3.拷贝整个文件夹
  • 只拷贝指定文件夹下内容到目标文件夹。不包括指定文件夹

task copyDirectory(type: Copy) { from "$buildDir/sourceFiles" into "$buildDir/destination" }

  • 拷贝包括指定文件夹,及该文件夹下的内容。需要指定include

task copyDirectory2(type: Copy) { from("$buildDir") { include "sourceFiles/**" } into "$buildDir/destination" }

4.建立归档文件(Zip,tar等等)

比较常用的归档类型有Zip,Jar,Tar。这些类型的属性和方法和Copy类型的大体相同。

下面是一个把文件夹打包成zip的例子。

task createZip(type: Zip) { archiveFileName = "my-zip.zip" destinationDirectory = file("$buildDir/destination") from "$buildDir/sourceFiles" }

还有一种比较常见的需求,是把某些分散在各个文件夹,子文件夹的某一类型的文件打包归档到一个另外的文件夹中。如下所示

plugins { id 'base' } version = "1.0.0" task createZip2(type: Zip) { // 首先将文件夹及其子文件夹的txt文件除外,不影响其他文件打包 from("$buildDir/sourceFiles") { exclude "**/*.txt" } // 其次,将除外的文件压缩到一个文件夹docs中。docs文件夹是自动生成的 from("$buildDir/sourceFiles") { include "**/*.txt" // 这里没有用destinationDirectory 指定路径 // 所以zip文件会默认放在/build/distributions/文件夹中 into "docs" } }

打包前的文件构成如下

ProjectA

│ build.gradle

└─build

├─destination

└─sourceFiles

│ file1.txt

│ file2.txt

│ file3.pdf

└─folder1

file1infolder1.txt

file2infolder1.txt

file3infolder1.pdf

打包后会在build文件夹中生成ditributions文件夹用来存放zip文件。zip文件构成如下:

projectA-1.0.0.zip

│ file3.pdf

├─folder1

│ file3infolder1.pdf

└─docs

│ file1.txt

│ file2.txt

└─folder1

file1infolder1.txt

file1infolder2.txt

5.将归档文件解压缩

Gradle提供了两种方法取得解压缩后的文件:zipTree和tarTree。他们可以生成一个FileTree的对象用于Copy类型的from方法来实现解压缩。

task unpackFiles(type: Copy) { from zipTree("$buildDir/distributions/projectA-1.0.0.zip") into "$buildDir/resources" }

注意:如果是jar包,也可以用zipTree方法。

6.打包成为fat jar

fat jar就是将一个jar及其依赖的三方jar全部打到一个包中。简化了一下官网的例子。

// java插件 plugins { id 'java' } version = '1.0.0' // 声明仓库,依赖所用到的包都从该仓库自动下载 repositories { mavenCentral() } // 依赖,后面会着重学习理解关于依赖的知识 dependencies { implementation 'commons-io:commons-io:2.6' } // sourceFiles文件夹放了两个jar包 FileTree ft = fileTree("$buildDir/sourceFiles") task uberJar(type: Jar) { // 该字符串会拼接到新的jar包的名称中 archiveClassifier = 'uber' // 利用与java的stream相似的功能,将定位作为输入的jar包 from { ft.findAll { it.name.endsWith('jar') }.collect { zipTree(it) } } }

输出的新jar包会放在build/libs文件夹

这里使用了java插件,还有对commons-io的依赖。暂时不清楚起到什么作用。如果不用的话会出现需No value has been specified for property 'archiveFile'错误。要后续学习理解。

7.建立文件夹,删除文件夹或文件
  • 用户指定的所有输出文件夹都会自动建立。如果想手动建立文件夹也很简单。

task ensureDirectory { doLast { mkdir "myfolder" } }

  • 删除文件或文件夹有两种方式,用Delete类型的任务或者Project.delete方法。这里只介绍前者

// 直接删除build文件夹下的所有内容 task myClean(type: Delete) { delete buildDir } // 删除src文件夹及其子文件夹下的tmp类型的文件 task cleanTempFiles(type: Delete) { delete fileTree("src").matching { include "**/*.tmp" } }

8.移动文件和文件夹。

Gradle没有提供相关API,可以用ant来实现。Gradle不推荐这种方式。推荐使用Copy。

task moveReports { doLast { ant.move file: "${buildDir}/from", todir: "${buildDir}/to" } }

9.拷贝的同时更改文件名字

利用rename方法和正则表达式来重命名复数个文件。下面的例子演示了删除所有文件名中的new字符串。

task copyAndRename(type: Copy) { from "$buildDir/sourceFiles" into "$buildDir/destination" rename '(. )new(. )', '$1$2' }

也可以用闭包实现更复杂的功能。下面的例子将长度超过10的文件名缩短为7位加上~符号。

task copyWithTruncate(type: Copy) { from "$buildDir/sourceFiles" rename { String filename -> if (filename.size() > 10) { return filename[0..7] "~" filename.size() } else return filename } into "$buildDir/destination" }

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页