在自定义gradle插件中创建SourceSet样式语法
我正在编写一个小gradle插件,它需要公开两个源位置的配置。我目前正在通过一个项目扩展进行此操作,consumer gradle文件的语法如下:在自定义gradle插件中创建SourceSet样式语法,gradle,Gradle,我正在编写一个小gradle插件,它需要公开两个源位置的配置。我目前正在通过一个项目扩展进行此操作,consumer gradle文件的语法如下: generator { idl { baseDir = "src" include = "*.idl" exclude = "**/.svn" } template { baseDir = "src" include = "*.template"
generator {
idl {
baseDir = "src"
include = "*.idl"
exclude = "**/.svn"
}
template {
baseDir = "src"
include = "*.template"
exclude = "**/.svn"
}
}
我的第一次尝试是在扩展类上有两个属性,如下所示:
class GeneratorExtension {
public static final NAME = "generator"
private Project project
GeneratorExtension(Project project) {
this.project = project
}
@Input ConfigurableFileTree idl
@Input ConfigurableFileTree template
void idl(String dir, Closure closure) {
idl = project.fileTree(dir, closure)
}
void template(String dir, Closure closure) {
template = project.fileTree(dir, closure)
}
}
这会将gradle文件语法更改为:
generator {
idl (dir = "src") {
include = "*.idl"
exclude = "*"
}
template (dir = "src") {
include = "*.template"
exclude = ""
}
}
现在这是可行的,但它没有给我我想要的干净的可用性。我对gradle和groovy都是新手,看起来我可能可以通过使用DefaultNamedDomainObjectSet来实现我想要的,但是它引用了内部类,所以我来到这里
添加扩展的正确方法是使用FileTree,但保持干净的使用者语法
提前感谢。感谢和彼得的上述评论(这意味着加倍感谢彼得),我想出了一个解决方案。将NamedDomainObjectContainer引入到我的思想中,为消费者提供了更好的语法
以下是我最终得到的结果:
generator {
idl {
dir = 'src'
include = "*.idl"
exclude = "*"
}
templates {
java {
dir = 'src'
include = '*.template'
}
javascript {
dir = 'src'
include = '*.template'
}
}
}
以及插件代码:
class GeneratorPlugin implements Plugin<Project> {
private GeneratorExtension extension
void apply(Project project) {
def templates = project.container(FileTreeContainer)
extension = project.extensions.create(GeneratorExtension.NAME, GeneratorExtension, project, templates)
applyTasks(project)
}
void applyTasks(final Project project) {
project.task('generateJava', type: GenerateJavaTask, group: 'Preprocess', description: 'Generate Java files based on provided IDL files and templates') { }
project.task('generateJavascript', type: GenerateJavascriptTask, group: 'Preprocess', description: 'Generate Javascript files based on provided IDL files and templates') { }
}
}
class GeneratorExtension {
public static final NAME = "generator"
private Project project
@Input FileTreeContainer idl
@Input NamedDomainObjectContainer<FileTreeContainer> templates
GeneratorExtension(Project project, NamedDomainObjectContainer<FileTreeContainer> templates) {
this.project = project
idl = new FileTreeContainer("idl")
this.templates = templates
}
void idl(Closure closure) {
project.configure(idl, closure)
idl.fileTree = project.fileTree(idl.dir) {
include idl.include
exclude idl.exclude
}
}
void templates(Closure closure) {
templates.configure(closure)
String foo = "hello"
}
}
class GeneratorPlugin实现插件{
专用GeneratorExtension扩展
无效申请(项目){
def templates=project.container(FileTreeContainer)
extension=project.extensions.create(GeneratorExtension.NAME、GeneratorExtension、project、templates)
应用程序任务(项目)
}
作废应用程序任务(最终项目){
task('generateJava',type:GenerateJavaTask,group:'Preprocess',description:'根据提供的IDL文件和模板生成Java文件'){}
task('generateJavascript',type:GenerateJavascriptTask,group:'Preprocess',description:'根据提供的IDL文件和模板生成Javascript文件'){}
}
}
类GeneratorExtension{
公共静态final NAME=“生成器”
私人项目
@输入文件树容器idl
@输入NamedDomainObjectContainer模板
GeneratorExtension(项目,名称DDomainObjectContainer模板){
this.project=project
idl=新文件树容器(“idl”)
this.templates=模板
}
无效idl(关闭){
配置项目(idl、关闭)
idl.fileTree=project.fileTree(idl.dir){
include idl.include
排除idl.exclude
}
}
空心模板(闭合){
模板。配置(闭包)
String foo=“你好”
}
}
查看project.container()
,例如在中。感谢您的提示!我现在开始按照我想要的方式跑步了!