我想尝试new rule based configuration in Gradle配置我的插件。插件的目的是将数据上传到云存储,例如 Google Drive 或 S3。我需要为用户想要使用的每个存储进行配置。所以,我想要实现的是:
model {
backup { // this is a container for all storages I want to support
googleDrive {
clientId = ''
clientSecret = ''
accessToken = ''
refreshToken = ''
}
s3 {
// S3 specific config (like API keys)
}
}
}
在我的插件中,我为 backup
元素配置规则源:
class BackupPlugin implements Plugin<Project> {
static class Rules extends RuleSource {
@Model
void backup(BackupPluginExtension backupModel) {}
}
}
@Managed
interface BackupPluginExtension {
GoogleDrive getGoogleDrive()
void setGoogleDrive(GoogleDrive googleDrive)
}
@Managed
interface GoogleDrive {
String getClientId()
void setClientId(String clientId)
String getClientSecret()
void setClientSecret(String clientSecret)
String getAccessToken()
void setAccessToken(String accessToken)
String getRefreshToken()
void setRefreshToken(String refreshToken)
}
但是,这不起作用:在根项目“test”上找不到参数 [build_8w85xu7hrz3atgeg839d33hzl$_run_closure1_closure2_closure3@1b06ac95] 的方法 googleDrive()。
。看起来它尝试调用 backup
内部的方法而不是配置嵌套 bean。
那么,正确的语法是什么?
我了解命名集合,但问题是如何配置自定义 bean 层次结构。
最佳答案
玩了一段时间后,似乎将 googleDrive
设置为只读(即通过删除 setGoogleDrive()
setter)即可修复你的问题(运行gradle model
时我得到BUILD SUCCESSFUL)。
经过一些小的修改(使用 @Mutate
而不是 Plugin.apply
),它看起来像这样:
apply plugin: BackupPlugin
class BackupPlugin extends RuleSource {
@Model
void backup(BackupPluginExtension backupModel) {
}
@Mutate void createTasks(ModelMap<Task> tasks, BackupPluginExtension model) {
tasks.create("backup") {
doLast {
// ... do stuff
println "googleDrive.clientId = ${model.googleDrive.clientId}"
}
}
}
}
@Managed
interface BackupPluginExtension {
GoogleDrive getGoogleDrive()
// void setGoogleDrive(GoogleDrive googleDrive)
}
@Managed
interface GoogleDrive {
String getClientId()
void setClientId(String clientId)
String getClientSecret()
void setClientSecret(String clientSecret)
String getAccessToken()
void setAccessToken(String accessToken)
String getRefreshToken()
void setRefreshToken(String refreshToken)
}
model {
backup { // this is a container for all storages I want to support
googleDrive {
clientId = 'someId'
clientSecret = ''
accessToken = ''
refreshToken = ''
}
}
}
在此打印上运行 gradle backup
googleDrive.clientId = someId
。
关于Gradle 基于规则的模型嵌套 beans 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34359856/