上文 讲述了 Gradle 中关于任务的基础概念,本文开始讲述下 Task 是如何定义的。java
为了方便,咱们的语境分不开Gradle
和Android Gradle Plugin
,所以此处不脱离Android
环境来介绍Gradle
。
咱们在讲述任务依赖的时候,提到一个Manager
的东西,在这里,咱们说到的是Android Gradle Plugin
提供的BuildableArtifactsHolder
这个类。api
一个 Task 若是有有意义的输出,且产物可能被其余的 Task 所使用的时候,咱们能够往BuildableArtifactsHolder
注册咱们的产物,注册方式有这么几种:app
createBuildableArtifact/createDirectory/createArtifactFile
这些 api 须要传入建立文件的类型,文件的文件名,动做等,以createArtifactFile
的其中一种形式为例:ide
fun createArtifactFile( artifactType: ArtifactType, operationType: OperationType, taskName: String, fileName: String) : Provider<RegularFile>
artifactType
就是产物类型函数
operationType
是操做类型,能够是初始化(init),追加(append),或者变化(transform),区别以下:gradle
你能够根据你使用产物的目的来使用不一样类型,由于返回值是一个 FileCollection (文件集合,不是文件夹的概念),若是调用的是 transform,你须要注意在 Configuration 阶段对于这些产物调用顺序的问题,若是 B.transform 在 A.transform 以后,那么获取最终产物的时候,就会取走 B 的结果。ui
BuildableArtifactsHolder 提供的 api 通常都已经让你传入了 taskName,就是让你告诉它,你所产生的产物由哪一个任务生成。后续你去根据 artifactType 获取产物(FileCollection)的时候,它会检查这个任务是否执行,若是没有的话会先执行,这部分判断的逻辑由 FileCollection 的 builtBy 作到,由 Gradle 进行管理。spa
以上,咱们介绍了如何让 Task 的产物和 Task 自己产生一些关联,这种关联创建完成以后,能够看到 createArtifactFile 这个函数的返回值是Provider<RegularFile>
,这里表明了一个目的地,咱们往这个文件里写入的产物便可;固然这里也能够建立文件夹同理,示例代码:code
task.outputFile = variantScope.getArtifacts().createArtifactFile( InternalArtifactType.BUNDLE, BuildArtifactsHolder.OperationType.INITIAL, taskName, bundleName)
而后在 task 定义的地方:orm
class Task { private Provider<RegularFile> outputFile; @OutputFile public Flie getOutputFile() { return outputFile.get().asFile(); } }
这样的话,gradle 会自动帮你建立这个文件,开发者须要的只是调用getOutputFile()
拿到File
而后写入便可。
咱们知道了 Task 产生一个文件的完整流程,咱们该如何使用这个文件呢?咱们在另一个 Task 中,定义一下 input
task.input = variantScope.getArtifacts().getArtifactFiles(type); //这里的 type 和上面的type同样,好比 InternalArtifactType.BUNDLE
这个拿到是一个 BuildableArtifact 对象,它的声明以下:
interface BuildableArtifact : Iterable<File>, Buildable, Supplier<FileCollection> { val files : Set<File> fun isEmpty() : Boolean }
可使用get()
获取一个FileCollection
,当再次调用FileCollection.getFiles()
方法时,gradle 就会检查产生这个产物的 Task 是否已经执行,若是没有执行,就会先执行前面一个 Task
欢迎关注个人公众号「TalkWithMobile」