当前位置: 首页 > 知识库问答 >
问题:

Gradle:如何用扩展属性初始化SourceTask的属性'source'?

查锦程
2023-03-14

我的插件注册了一个扩展和一些从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
    }
}
myPlugin {
    source{
        main {
            something {
                srcDirs "src/main/resources"
            }
        }
    }
}
doSomething {
    source = myPlugin.source.main.something.asFileTree
}

共有1个答案

屈畅
2023-03-14

我不确定我是否完全理解您在做什么,但您可能会使用闭包来延迟评估。请参阅Project.Files(Object...)

例如:

doSomething {
    def myClosure = {
        extension.source.findAll().inject(project.files().asFileTree, { result, item -> result + item.html.asFileTree })
    }
    source = files(myClosure)
}
 类似资料:
  • 但是我得到错误“在初始化之前使用属性”这是有道理的,因为我只声明。但是我不知道我应该如何或为了什么初始化输入,因为值是输入

  • 我在想,是否可以使用对< code>this关键字的引用来初始化一个(引用类型)属性(当它的值为< code>null),而不使用构造函数。< br >在某些情况下,我不想使用构造函数来初始化属性,因此,如果没有人访问它,它的值将不会被创建。< br >此外,如果可能的话,我不喜欢在构造函数中将属性声明与其初始化分开。 一个典型的例子是MVVM模式编程的命令声明: 我不喜欢写三倍的成员的名字… 我

  • 问题内容: 您将如何在Swift中实现以下模式? 所述类被初始化,其中包含的词典JSON数组。这些字典用于初始化类。但是,当访问或属性时,对象的初始化会延迟进行。 问题答案: 看来这个问题已经得到了很大的回答,但是回过头来看原始帖子,这是(IMHO)Swift中相对简洁的翻译。关键是您可以链接惰性属性。请注意,我同时使用了类函数和闭包- 两者都很好。

  • 问题内容: 我想从属性文件中的init我的ORB(通常我初始化它像这样,在运行我的例子: ) 我写了一个简单的代码: 然后尝试初始化我的球体: 但是有一些错误: 我的config.properties文件: 我做错了什么? 通常,当我初始化我的ORB时,一切都很好,所以它不是代码问题,而是文件初始化的问题。 问题答案: 您还必须添加到ORB参数。将其与您通常使用的命令行进行比较。所有参数都必须传递

  • 我在代码中使用了合成属性。但想知道它如何以及何时初始化Android中的每个视图。 我们只提供导入和访问每个视图的ID。何时为视图对象分配内存?

  • 问题内容: 我希望图片移到底部。如果按按钮,图片应向下移动1。 我添加了图片和一个按钮: 至少我在函数“ fahren”中说过将图片向下移动1。 所以我的问题是:这些corX和corY东西会出现一些错误。没有它们,它会完美地工作,但比起一次性按钮就好。错误是:ViewController.Type没有名为corX的成员,而ViewController.Type没有名为panzer的成员。 PS:我