2017-01-03 145 views
0

我想写使用kotlingradle的Gradle插件插件扩展的一个实例。它应该像这样工作。同时提供配置无法创建

apply plugin: 'appenv' 

app { 
    srcLink "" 
    downloadPath "" 
} 

应该允许使用任务从srcLink和商店下载文件中downloadPathdownloadAll

我创建扩展类

open class ApplicationEnvironmentExtension { 
    val project: Any? 

    constructor(project: Any?) { 
     this.project = project 
    } 

    var srcLink: String = "" 
    var downloadPath: String = "" 
} 

创建插件类

class ApplicationEnvironmentPlugin : Plugin<Project> { 

    override fun apply(project: Project) { 
     project.extensions.create("app", ApplicationEnvironmentExtension::class.java) 
     project.task(mapOf ("type" to Download::class.java), "downloadAll") 
    } 
} 

在这里他的t他任务

class Download : DefaultTask() { 

    @TaskAction 
    fun download() { 
     val extension = this.project.extensions.getByName("app") as ApplicationEnvironmentExtension 
     DownloadUtils.download(extension.srcLink, extension.downloadPath) 
    } 
} 

我建立它并将其添加为jar依赖于我的项目。 要检查是否添加了任务,请运行gradle tasks。但在我得到的错误

Could not create an instance of type com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated. 

在堆栈跟踪我得到

Caused by: org.gradle.internal.reflect.ObjectInstantiationException: Could not create an instance of type com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated. 
     at org.gradle.internal.reflect.DirectInstantiator.newInstance(DirectInstantiator.java:53) 
     at org.gradle.api.internal.ClassGeneratorBackedInstantiator.newInstance(ClassGeneratorBackedInstantiator.java:36) 
     at org.gradle.api.internal.plugins.DefaultConvention.create(DefaultConvention.java:106) 
     at com.lapots.gradle.plugins.appenv.ApplicationEnvironmentPlugin.apply(ApplicationEnvironmentPlugin.kt:11) 
     at com.lapots.gradle.plugins.appenv.ApplicationEnvironmentPlugin.apply(ApplicationEnvironmentPlugin.kt:8) 
     at org.gradle.api.internal.plugins.ImperativeOnlyPluginApplicator.applyImperative(ImperativeOnlyPluginApplicator.java:35) 
     at org.gradle.api.internal.plugins.RuleBasedPluginApplicator.applyImperative(RuleBasedPluginApplicator.java:43) 
     at org.gradle.api.internal.plugins.DefaultPluginManager.doApply(DefaultPluginManager.java:144) 
     ... 58 more   
Caused by: java.lang.IllegalArgumentException: Could not find any public constructor for class com.lapots.gradle.plugins.appenv.ApplicationEnvironmentExtension_Decorated which accepts parameters []. 
     at org.gradle.internal.reflect.DirectInstantiator.newInstance(DirectInstantiator.java:44) 
     ... 65 more  

问题是什么?我应该为扩展提供一些附加的构造函数吗?

回答

4

扩展需要一个默认的(无参数)构造函数。如果您确实需要为扩展名中的值指定一个字段,则可以使用lateinit var并在插件中创建扩展名后指定它。

在这种情况下,它看起来并不像你需要你的project领域,所以你可以摆脱那个和构造。否则,如果你确实需要的领域,仍然取下的构造,但你需要做project一个变种与null的默认值。

+0

很酷。有用。 – lapots