如何在自定義 gradle 插件中創建嵌套引數結構?
對于初學者,我使用的是 Gradle 7.2。我想為我的插件配置制作一個富有表現力的類似 DSL 的結構,其中包含一個嵌套元素
fileDiff {
file1 = file('${testFile1.getName()}')
file2 = file('${testFile2.getName()}')
messages {
message1 = 'Hi there'
}
}
在學習如何撰寫 Gradle 插件時,我一直在關注gradle 插件實作檔案,它們非常擅長展示如何處理擴展而不是“插件”類。
所以我已經模擬了我的擴展,FileDiffExtension就像這樣
abstract class FileDiffExtension {
abstract RegularFileProperty getFile1()
abstract RegularFileProperty getFile2()
@Nested
abstract Messages getMessages()
void messages(Action<? super Messages> action) {
action.execute(getMessages())
}
}
嵌套Messages類就是這樣建模的
abstract class Messages {
abstract Property<String> getMessage1()
}
我認為我在這一點上做得很好。然后我需要將我的擴展程式拉到我的插件中,這就是我認為我遇到問題的地方。我的插件類目前看起來像
class FileDiffPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.tasks.register('fileDiff', FileDiffTask) {
project.extensions.create('fileDiff', FileDiffExtension)
project.fileDiff.extensions.create("messages", FileDiffExtension.messages)
file1 = project.fileDiff.file1
file2 = project.fileDiff.file2
messages = project.fileDiff.getMessages
}
}
}
我正在嘗試messages從根級別擴展創建一個擴展fileDiff。或者也許我不應該將messages任務中的物件設定為 getMessages() 抽象方法。但我已經嘗試了所有我能想到的組合。實際任務如下所示,但我認為問題不在于這里。
abstract class FileDiffTask extends DefaultTask {
@InputFile
abstract RegularFileProperty getFile1()
@InputFile
abstract RegularFileProperty getFile2()
@Input
abstract Property<Messages> getMessages()
@OutputFile
abstract RegularFileProperty getResultFile()
FileDiffTask() {
resultFile.convention(project.layout.buildDirectory.file('diff-result.txt'))
}
@TaskAction
def diff() {
// Print out the message
println messages.get().message1.toString()
// Now we do some fun file stuff
String diffResult
if (size(file1) == size(file2)) {
diffResult = "Files have the same size at ${file1.get().asFile.getBytes()} bytes}"
} else {
File largestFile = size(file1) > size(file2) ? file1.get().asFile : file2.get().asFile
diffResult = "${largestFile.toString()} is the largest file at ${largestFile.size()} bytes"
}
resultFile.get().asFile.write diffResult
println "File written to $resultFile"
println diffResult
}
private static long size(RegularFileProperty regularFileProperty) {
return regularFileProperty.get().asFile.size()
}
}
為了測驗我正在使用 gradle 測驗套件,我目前收到以下錯誤。`
無法創建任務 ':fileDiff'。沒有這樣的屬性:類的訊息:com.robschwartz.plugins.filediff.FileDiffExtension 可能的解決方案:訊息`
uj5u.com熱心網友回復:
嗯,根據檔案,如果子擴展被標記為 ,則不需要對它做任何事情@Nested,它應該可以作業。您是否嘗試過完全洗掉此行?
project.fileDiff.extensions.create("messages", FileDiffExtension.messages)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427919.html
