当前位置:K88软件开发文章中心编程工具Gradle → 文章内容

Gradle 使用文件

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-24 10:31:28

由 珍珍阿姨 创建, 最后一次修改 2016-08-12 使用文件大多数构建工作都要使用到文件。Gradle 添加了一些概念和 API 来帮助您实现这一目标。定位文件你可以使用 Project.file()方法来找到一个相对于项目目录的文件 。查找文件build.gradle // Using a relative pathFile configFile = file('src/config.xml')// Using an absolute pathconfigFile = file(configFile.absolutePath)// Using a File object with a relative pathconfigFile = file(new File('src/config.xml')) 您可以把任何对象传递给 file()方法,而它将尝试将其转换为一个绝对路径的 File 对象。通常情况下,你会传给它一个 String 或 File 的实例。而所提供的这个对象的 tostring() 方法的值会作为文件路径。如果这个路径是一个绝对路径,它会用于构构一个 File 实例。否则,会通过先计算所提供的路径相对于项目目录的相对路径来构造 File 实例。这个 file()方法也可以识别URL,例如是 file:/some/path.xml。这是把一些用户提供的值转换为一个相对路径的 File 对象的有用方法。由于 file()方法总是去计算所提供的路径相对于项目目录的路径,最好是使用 new File(somePath),因为它是一个固定的路径,而不会因为用户运行 Gradle 的具体工作目录而改变。文件集合一个文件集合只是表示一组文件。它通过 FileCollection 接口来表示。Gradle API 中的许多对象都实现了此接口。比如,依赖配置 就实现了 FileCollection 这一接口。使用 Project.files()方法是获取一个 FileCollection 实例的其中一个方法。你可以向这个方法传入任意个对象,而它们会被转换为一组 File 对象。这个 Files() 方法接受任何类型的对象作为其参数。根据16.1 章节 “定位文件”里对 file() 方法的描述,它的结果会被计算为相对于项目目录的相对路径。你也可以将集合,迭代变量,map 和数组传递给 files() 方法。它们会被展开,并且内容会转换为 File 实例。创建一个文件集合build.gradle FileCollection collection = files('src/file1.txt', new File('src/file2.txt'), ['src/file3.txt', 'src/file4.txt']) 一个文件集合是可迭代的,并且可以使用 as 操作符转换为其他类型的对象集合。您还可以使用+运算符把两个文件集合相加,或使用-运算符减去一个文件集合。这里是一些使用文件集合的例子。使用一个文件集合build.gradle // Iterate over the files in the collectioncollection.each {File file -> println file.name}// Convert the collection to various typesSet set = collection.filesSet set2 = collection as SetList list = collection as ListString path = collection.asPathFile file = collection.singleFileFile file2 = collection as File// Add and subtract collectionsdef union = collection + files('src/file3.txt')def different = collection - files('src/file3.txt') 你也可以向 files()方法传一个闭包或一个 Callable 实例。它会在查询集合内容,并且它的返回值被转换为一组文件实例时被调用。这个闭包或 Callable 实例的返回值可以是 files() 方法所支持的任何类型的对象。这是 “实现” FileCollection 接口的简单方法。实现一个文件集合build.gradle task list << { File srcDir // Create a file collection using a closure collection = files { srcDir.listFiles() } srcDir = file('src') println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it } srcDir = file('src2') println "Contents of $srcDir.name" collection.collect { relativePath(it) }.sort().each { println it }} gradle -q list 的输出结果 > gradle -q listContents of srcsrc/dir1src/file1.txtContents of src2src2/dir1src2/dir2 你可以向 files() 传入一些其他类型的对象:FileCollection它们会被展开,并且内容会被包含在文件集合内。Task 任务的输出文件会被包含在文件集合内。TaskOutputs TaskOutputs 的输出文件会被包含在文件集合内。要注意的一个地方是,一个文件集合的内容是缓计算的,它只在需要的时候才计算。这意味着您可以,比如创建一个 FileCollection 对象而里面的文件会在以后才创建,比方说在一些任务中才创建。文件树文件树是按层次结构排序的文件集合。例如,文件树可能表示一个目录树或 ZIP 文件的内容。它通过 FileTree 接口表示。FileTree 接口继承自 FileCollection,所以你可以用对待文件集合一样的方式来对待文件树。Gradle 中的几个对象都实现了 FileTree 接口,例如 source sets。使用 Project.fileTree()方法是获取一个 FileTree 实例的其中一种方法。它将定义一个基目录创建 FileTree 对象,并可以选择加上一些 Ant 风格的包含与排除模式。创建一个文件树build.gradle // Create a file tree with a base directoryFileTree tree = fileTree(dir: 'src/main')// Add include and exclude patterns to the treetree.include '**/*.java'tree.exclude '**/Abstract*'// Create a tree using pathtree = fileTree('src').include('**/*.java')// Create a tree using closuretree = fileTree('src') { include '**/*.java'}// Create a tree using a maptree = fileTree(dir: 'src', include: '**/*.java')tree = fileTree(dir: 'src', includes: ['**/*.java', '**/*.xml'])tree = fileTree(dir: 'src', include: '**/*.java', exclude: '**/*test*/**') 你可以像使用一个文件集合的方式一样来使用一个文件树。你也可以使用 Ant 风格的模式来访问文件树的内容或选择一个子树:使用文件树build.gradle // Iterate over the contents of a treetree.each {File file -> println file}// Filter a treeFileTree filtered = tree.matching { include 'org/gradle/api/**'}// Add trees togetherFileTree sum = tree + fileTree(dir: 'src/test')// Visit the elements of the treetree.visit {element -> println "$element.relativePath => $element.file"} 使用归档文件的内容作为文件树您可以使用档案的内容,如 ZIP 或者 TAR

[1] [2] [3]  下一页


Gradle 使用文件