第二十四天:三探 Gradle Plugin

延续昨天的 Plugin 实作,今天来看一下 Extension 及 Task 类别各要怎麽实作?

Extension 类别

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 类别

接着来建立 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()
    }
}

现在我们有:

  • 两个输入档案的属性:Plugin 将会从属性取得值然後送到任务去执行
  • @InputFile Annotation:在两个输入档案的属性上,这表示 Gradle 会去监看这些档案的变更,并在档案变更的时候重新执行一次
  • 输出档案属性:Plugin 将会把差异比对的结果输出到 @OutputFile Annotation 属性上。Gradle 将会监看这个档案,并在变更的时候重新执行一次
  • 一个被 @TaskAction 标记的方法:此方法是在执行任务时运行的方法。它使用两个档案输入来计算哪个更大,并产生文字输出,然後将结果写入 resultFile 和标准输出

<<:  2.4.5 Design System - Card

>>:  Day 14 Detect objects in images with the Custom Vision service

c语言中exit的用法

纪录一下遇到错误时直接exit的写法 #include <stdio.h> #inclu...

近似最短路径 (6)

11.6 距离标签 Distance Labellings 最短距离资料结构 Distance Or...

[Tableau Public] day 9:分析前先处理一下原始资料吧

第九天,打完疫苗已经22小时,目前只有接种处抬手会酸痛,目前还没感受到其他副作用。不过头已经开始有点...

[Day17]What is Merkle tree? - 2

hi~今天要延续昨天merkle tree的主题! 我们昨天简述完之後,有用图解,希望大家有更清楚...

Python GUI - 要如何在画面上显示右键选单呢?

在PySide 2 中要显示出右键选单非常容易, 只要跟着下面的作法作即可 作法 汇入 QMenu ...