Gradle:如何初始化SourceTask';s财产‘;来源’;有扩展属性吗?

Gradle:如何初始化SourceTask';s财产‘;来源’;有扩展属性吗?,gradle,groovy,gradle-plugin,Gradle,Groovy,Gradle Plugin,我的插件注册了一个扩展和一些从org.gradle.api.tasks.SourceTask继承的自定义任务 class MyPlugin implements Plugin<Project> { private final Instantiator instantiator private final FileResolver fileResolver @Inject MyPlugin (Instantiator instantiator, File

我的插件注册了一个扩展和一些从
org.gradle.api.tasks.SourceTask
继承的自定义任务

class MyPlugin implements Plugin<Project> {
    private final Instantiator instantiator
    private final FileResolver fileResolver
    @Inject
    MyPlugin (Instantiator instantiator, FileResolver fileResolver) {
        this.instantiator = instantiator
        this.fileResolver = fileResolver
    }
    void apply(Project project) {
        MyPluginExtension extension = project.extensions.create("myPlugin", MyPluginExtension, project, instantiator, fileResolver)
        project.tasks.create('doSomething', MyCustomTask) {}
    }
}

class MyPluginExtension {
    final MySourceSetContainer source
    MyPluginExtension(Project project, Instantiator instantiator, FileResolver fileResolver) {
        source = instantiator.newInstance(ImplMySourceSetContainer, project, instantiator, fileResolver)
    }
    void source(Closure closure) {
        ConfigureUtil.configure(closure, source)
    }
}

class MyCustomTask extends SourceTask {
    @TaskAction
    void act() {
        // something
    }
}
-一切正常。但是我想通过
MyPluginExtension
中的值初始化任务属性
source

source=extension.source.findAll().inject(project.files().asFileTree,{result,item->result+item.html.asFileTree})

我无法在执行阶段提取userguide()中描述的扩展属性,因为在超类
org.gradle.api.tasks.SourceTask
中声明的
source
的getter将被跳过,该getter用注释
@org.gradle.api.tasks.SkipWhenEmpty
标记,任务将被跳过

在执行阶段之前,如何使用扩展中的值初始化任务的属性?
Thx.

我不确定我是否完全理解您在做什么,但您可能会使用关闭来延迟评估。看

例如:


我不确定我是否完全理解您在做什么,但您可能会使用关闭来延迟评估。看

例如:


通过在闭包中包装源init解决:

class MyPlugin implements Plugin<Project> {
    // ...
    void apply(Project project) {
        MyPluginExtension extension = project.extensions.create("myPlugin", MyPluginExtension, project, instantiator, fileResolver)
        project.tasks.create('doSomething', MyCustomTask) { task ->
            task.source = { 
                extension.source.findAll().inject(new HashSet<File>(), { result, item -> result + item.html.srcDirs }) 
            }
        }
    }
}
classmyplugin实现插件{
// ...
无效申请(项目){
MyPluginExtension=project.extensions.create(“myPlugin”,MyPluginExtension,project,instantiator,fileResolver)
创建('doSomething',MyCustomTask){task->
task.source={
extension.source.findAll().inject(新的HashSet(),{result,item->result+item.html.srcDirs})
}
}
}
}

通过在闭包中包装源init解决:

class MyPlugin implements Plugin<Project> {
    // ...
    void apply(Project project) {
        MyPluginExtension extension = project.extensions.create("myPlugin", MyPluginExtension, project, instantiator, fileResolver)
        project.tasks.create('doSomething', MyCustomTask) { task ->
            task.source = { 
                extension.source.findAll().inject(new HashSet<File>(), { result, item -> result + item.html.srcDirs }) 
            }
        }
    }
}
classmyplugin实现插件{
// ...
无效申请(项目){
MyPluginExtension=project.extensions.create(“myPlugin”,MyPluginExtension,project,instantiator,fileResolver)
创建('doSomething',MyCustomTask){task->
task.source={
extension.source.findAll().inject(新的HashSet(),{result,item->result+item.html.srcDirs})
}
}
}
}

我想从名为“myPlugin”(type
MyPluginExtension
)的扩展中获取
source
值,提取FileTree对象,并将其设置为task属性(
MyCustomTask.source
)。我想从名为“myPlugin”(type
MyPluginExtension
)的扩展中获取
source
值,提取FileTree对象,并将其设置为任务属性(
MyCustomTask.source
)。
class MyPlugin implements Plugin<Project> {
    // ...
    void apply(Project project) {
        MyPluginExtension extension = project.extensions.create("myPlugin", MyPluginExtension, project, instantiator, fileResolver)
        project.tasks.create('doSomething', MyCustomTask) { task ->
            task.source = { 
                extension.source.findAll().inject(new HashSet<File>(), { result, item -> result + item.html.srcDirs }) 
            }
        }
    }
}