延续昨天的 Plugin 实作,今天来看一下 Extension 及 Task 类别各要怎麽实作?
Extension 类别负责处理 Plugin 的设定机制,请建立 src/main/kotlin/io/kraftsman/plugins/filediff
资料夹结构,我们将在里面放置所有相关的类别。
接着建立一个 FileDiffExtension.kt
的档案,里面的程序码大至上是:
package io.kraftsman.plugins.filediff
import org.gradle.api.file.RegularFileProperty
abstract class FileDiffExtension {
abstract fun getFile1(): RegularFileProperty
abstract fun getFile2(): RegularFileProperty
}
我们有两个属性代表输入的档案。请注意,这些是扩充 Property 的 RegularFileProperty 类别。在 Gradle 中,属性对象是一种在实际设置之前引用值的方法。这对於 Plugin 和 Task 很有用,因为在建构脚本中配置其实际值之前可能会引用属性值。
接着来建立 Task 类别 FileDiffTask.kt
,也就是实际进行比对工作的那个类别:
package io.kraftsman.plugins.filediff
import org.gradle.api.DefaultTask
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.InputFile
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
abstract class FileDiffTask(): DefaultTask {
@InputFile
abstract fun getFile1(): RegularFileProperty
@InputFile
abstract fun getFile2(): RegularFileProperty
@OutputFile
abstract fun getResultFile(): RegularFileProperty
init {
resultFile.convention(project.layout.buildDirectory.file('diff-result.txt'))
}
@TaskAction
fun diff() {
String diffResult
if (size(file1) == size(file2)) {
diffResult = "Files have the same size at ${file1.get().asFile.size()} bytes."
} else {
val largestFile: File = if (size(file1) > size(file2)) {
file1.get().asFile
} else {
file2.get().asFile
}
diffResult = "${largestFile.toString()} was the largest file at ${largestFile.size()} bytes."
}
resultFile.get().asFile.write diffResult
println("File written to $resultFile")
println(diffResult)
}
private fun size(regularFileProperty: RegularFileProperty): Long {
return regularFileProperty.get().asFile.size()
}
}
现在我们有:
@InputFile
Annotation:在两个输入档案的属性上,这表示 Gradle 会去监看这些档案的变更,并在档案变更的时候重新执行一次@OutputFile
Annotation 属性上。Gradle 将会监看这个档案,并在变更的时候重新执行一次@TaskAction
标记的方法:此方法是在执行任务时运行的方法。它使用两个档案输入来计算哪个更大,并产生文字输出,然後将结果写入 resultFile 和标准输出
<<: 2.4.5 Design System - Card
>>: Day 14 Detect objects in images with the Custom Vision service
纪录一下遇到错误时直接exit的写法 #include <stdio.h> #inclu...
11.6 距离标签 Distance Labellings 最短距离资料结构 Distance Or...
第九天,打完疫苗已经22小时,目前只有接种处抬手会酸痛,目前还没感受到其他副作用。不过头已经开始有点...
hi~今天要延续昨天merkle tree的主题! 我们昨天简述完之後,有用图解,希望大家有更清楚...
在PySide 2 中要显示出右键选单非常容易, 只要跟着下面的作法作即可 作法 汇入 QMenu ...