代码之家  ›  专栏  ›  技术社区  ›  Budius

扩展容器闭包内的渐变属性不可见

  •  0
  • Budius  · 技术社区  · 7 年前

    我正在尝试为Gradle编写这个自定义插件,但是我一直在向插件正确传递参数。

    在插件内部,我创建了如下扩展:

    @Override void apply(final Project p) {
        p.extensions.create('myPlugin', MyPluginData.class)
    

    然后在里面 MyPluginData 我正在处理 def propertyMissing(String name, value) 接收我期望的客户参数。

    最后在客户端应用程序中 build.gradle 我正在尝试配置数据:

    println("From root value is " + SOME_VALUE)
    
    myPlugin {
        println("From plugin value is " + SOME_VALUE)
        println("But from plugin 'findProperty' value is " + findProperty("SOME_VALUE"))
        clientDataSet = {
            data_1 = SOME_VALUE
            data_2 = findProperty("SOME_VALUE")
            data_3 = "this is a string"
    

    在我的项目中定义了一些值 gradle.properties ,我在生成期间得到了以下日志:

    从根值是正确的属性值
    源插件值为空
    但是从插件“findproperty”的值是正确的属性值

    当然,在接收 data_1 一些_值为空, data_2 有正确的值,数据3是我传递的硬编码字符串。


    我的问题:

    我做错了什么,或者插件上缺少哪个配置,这样客户端应用程序就可以直接引用插件中的属性。 渐变属性 文件夹?


    编辑: 按评论要求

    米拉普林达塔 仅仅是 extends HashMap<String, MyPluginDataSet> MyPluginDataSet 只是一些字符串。

    所以在里面 propertyMissing 我只是将属性名添加到映射中,然后创建 MyPuxIdLATASET 使用字符串(稍后用于生成自定义任务)。

    缺少的属性函数:

    def propertyMissing(String name, value) {
        // Create the new data set and add to the map
        def data = new MyPluginDataSet()
        put(name, data)
    
        // setup and execute the client closure to configure the data
        def closure = value as Closure
        closure.delegate = data
        closure.resolveStrategy = Closure.DELEGATE_FIRST
        closure.run()
    }
    
    1 回复  |  直到 7 年前
        1
  •  3
  •   M.Ricciuti    7 年前

    通过制作 MyPluginData 继承自 Map<> 我认为你以某种方式“破坏”了财产处置过程(见 ExtensionAware )Gradle不会尝试在不同范围内搜索“some-value”属性(因此它不会从Gradle属性扩展中找到此属性)

    也许你可以试着简化你 米拉普林达塔 通过存储内部映射而不是从映射继承来初始化?像这样:

    class MyPluginData {
        Map<String, MyPluginDataSet> internalMap = new HashMap<>()
    
        def propertyMissing(String name, value) {
            println "Entering propertyMissing for name = $name"
            // Create the new data set and add to the map
            def data = new MyPluginDataSet()
            internalMap.put(name, data)
    
            // setup and execute the client closure to configure the data
            def closure = value as Closure
            closure.delegate = data
            closure.resolveStrategy = Closure.DELEGATE_FIRST
            closure.run()
        }
    }